아이콘을 유지하면서 뒤로 버튼에서 텍스트 제거


96

뒤로 버튼에서 텍스트를 제거하고 싶지만 아이콘은 유지하고 싶습니다. 나는 시도했다

let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton

그러나 이렇게하면 텍스트와 아이콘이 완전히 제거됩니다.

답변:


99

@ rmd2의 방법은 거의 옳지 만 대신 뒤로 버튼이 가리키는 컨트롤러의 탐색 모음을 선택 " "하고 뒤로 버튼 필드에 입력해야 합니다.

여기에 이미지 설명 입력


1
의 ViewController는 내비게이션 바이없는 경우 최악의 방법으로, 나는 텍스트를 제거하기 위해 추가해야합니다
다니엘 벨트 라미

144

이미 답이 있다는 것을 알고 있지만 코드로도 할 수 있습니다 (펜촉으로 작업하는 경우)

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

첫 번째 뷰 컨트롤러에 위를 추가하십시오.

푸시하는 각 뷰 컨트롤러에 대해이 작업을 수행해야합니다. 따라서 3 개의 뷰 컨트롤러가 있고 이들 모두에서 백 텍스트를 제거하려면 뷰 컨트롤러 1과 2에 줄을 추가해야합니다.


5
이것은 내가 지금까지 본 가장 좋은 방법은 나에게 어떤 문제가 제공되지 않습니다
lostAtSeaJoshua

5
.Plain로 변경되었습니다 .plain. 자본금 없음 p.
Gal

완전한..! 그게 내가 원하는 것입니다.
JD.

최고의 솔루션. 감사.
Baran Emre

1
@ GastónAntonioMontes, 그것은 iOS13에 작업을 수행하지만 직관적 인 비트 카운터의 : backBarButtonItem가 선언되어야 빈 상태 (empty)의 타이틀을 밀어 뷰 컨트롤러가 아닌이 추진
마틴

49

많이 검색 한 후 가장 좋고 간단한 해결책을 찾았습니다. 이는 Swift 4.2로 작성되고 Swift 5에서 작동하는 모든 viewController에 영향을 미칩니다.

extension UIViewController {
    open override func awakeFromNib() {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
    }  
}

에 오신 것을 환영합니다 @ e.dimitrow
아이폰 OS Lifee에게

1
매력처럼 작동
Jerry Okafor

5
당신의 ViewController는 스토리 보드 또는 펜촉 ...에 포함되어있을 경우에만 동작합니다
나다니엘 Blumer

1
천재적인 솔루션!
WM

3
(12 시뮬레이터, 그냥 최신 아이폰 OS (13)는 여전히 iOS에서 작동) ... 이것은 나에 대한 작업에 사용, 그러나 더 이상
타냐를

37

뒤로 버튼의 텍스트는 마스터보기의 제목에 따라 다릅니다.

요령은 마스터 뷰가 사라지면 제목을 지우고 다시 표시되면 다시 설정하는 것입니다.

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    // needed to clear the text in the back navigation:
    self.navigationItem.title = " "
}

override func viewWillAppear(_ animated: Bool) {
   
    super.viewWillAppear(animated)
    self.navigationItem.title = "My Title"
}

33

당신이 밀어 뷰 컨트롤러에서 뒤로 버튼의 제목을 제거하고 싶다면,의 말을하자 <Settings<subSettingsViewController에서 다음 설정했습니다 backBarButtonItem의 SettingsViewController의에서 제목을 viewWillDisappear () 방법.

목표 -C :

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil];
}

빠른:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

1
.Plain로 변경되었습니다 .plain. 자본금 없음 p.
Gal

1
searchController 동작에 대한 답변을 업데이트해야합니다. 예를 들어 별도의 resultsVC를 사용하고 다른 VC를 푸시하는 항목을 탭하면 초기 searchController의 viewWillDisappear 메서드가 호출되지 않으므로 제목이 그대로 유지됩니다
H4Hugo

전체 앱의 화면에 대한 솔루션을 찾고 있다면 이는 좋은 접근 방식이 아닙니다. -일부 "Base View Controller"에이 코드를 추가하면 두 번째 뷰 컨트롤러의 viewDidAppear 이후에 첫 번째 뷰 컨트롤러의 viewWillDisappear가 호출됩니다. 가장 좋은 방법은 덮어 쓰기 뒤로 가기 버튼이다
미트라 Singam

완벽한 솔루션 덕분에
수레 쉬 SANKE

28

뒤로 화살표를 원하면 다음 코드를 AppDelegate 파일에 didFinishLaunchingWithOptions 메서드에 넣습니다.

Swift 용

let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)

2
단일 파일에서 앱 스타일을 표준화하고 앱 델리게이트에서 한 번 호출 할 수 있기 때문에이 기능이 마음에
듭니다.

4
그것은 당신이 백 제외한 다른 모음 단추 항목을 한 경우 까다로운 일이 될 수 있어요 ... 정말 친절하고 빠른 해결책 :하지만,)
vhristoskov

3
".normal"속성 만 구현하면 클릭시 텍스트가 표시됩니다. ".selected", ".highlighted"및 ".disabled"에 대해 동일한 행을 추가하십시오. 깜박임 텍스트가 표시되지 않도록합니다.
Nick N

1
나는 이것이 부작용이있을 것이라고 생각하고, 뒤로 버튼을 제외한 다른 바 버튼도 영향을받을 것이고 명확한 텍스트 색상을 갖게 될 것입니다 :(
dhin

24

제 경우에는 사용자 정의 아이콘과 제목에 대해 이것이 트릭을 수행했습니다 (Swift 4).

    let imgBack = UIImage(named: "ic_back")

    navigationController?.navigationBar.backIndicatorImage = imgBack
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = imgBack

    navigationItem.leftItemsSupplementBackButton = true
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: nil)

1
그 코드의 마지막 줄은 나에게 완벽하게 작동했습니다. 다른 모든 제안은 작동하지 않았습니다. 아마도 내 뷰 컨트롤러가 모두 탐색 컨트롤러에 의해 제어되기 때문일 것입니다. 어떤 경우에 navigationController? 정말 필요합니다.
Salx

사용자 지정 뒤로 단추를 추가하려면 맨 위 네 줄이 필요합니다. 그렇지 않으면 마지막 줄이 트릭을 할 것입니다.
Rafiqul Hasan 2018

14

이전 ViewController의 StoryBoard Title에 ""를 추가하여이 문제를 해결했습니다. 공백이 아닌 단지 공백; D

여기에 이미지 설명 입력


제목이 있으려면 이전 화면이 필요하므로이 기능이 작동하지 않을 것 같습니다.
lmiguelvargasf

2
나는 그 제목 났을했지만 여전히 제목은 뒤로 버튼을 제목에오고있다
Himali 샤

1
돌아 가기 버튼 필드 (공간) "는 제목, 필드,"넣지 빈 할
키릴 S.

13

마침내 완벽한 솔루션을 찾았습니다.

투명한 이미지 하나를 추가하고 AppDelegate에 다음 코드를 추가하기 만하면됩니다.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)

1
이것은 확실히 최고의 대답입니다. 나는 이전에 UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment대부분의 다른 답변이 권장 하는 해킹을 사용 했지만 긴 제목을 가진 뷰 컨트롤러의 경우 iPhone X에서 손상되었습니다. 이 솔루션은 완벽하게 작동합니다.
Ned

3
최고의 답변입니다. 투명한 텍스트 색상보다 더 잘 작동했습니다.
William T.

1
지난 4 년간 사용한 최고의 솔루션! 한 곳에서 모든 뷰 컨트롤러에 대해 한 번만 수행하십시오 !!!
korgx9

1
iOS 12에서 이것을 시도했을 때 텍스트는 여전히 이미지 옆에 나타납니다. :(
Sean McMains 2018

13

신속한 4

self.navigationController?.navigationBar.topItem?.title = ""

감사합니다, 그것은 (스위프트 4.0, 엑스 코드 10.1, 아이폰 OS 12.1.1), 덕분에 나를 도와
infinity_coding7

3
하지만, 당신은 부모 VC에 제목을 잃은 것
웨이 루

1
큰 제목이 있으면 topItem은 largeTitle입니다. 작동하지 않습니다
Saranjith

11

이것은 나를 위해 일하고 있습니다

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

1
하나를 수정하십시오. iOS 13에서는 navigationItem.backBarButtonItem이 작동하지 않습니다. 시간을 절약 할 수있었습니다. 감사합니다
Manish

10

들어 스위프트 4+ 이 줄을 넣어 AppDelegate에서didFinishLaunchingWithOptions

let BarButtonItemAppearance = UIBarButtonItem.appearance()

BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)      
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

앱 대리자에서 모양을 설정할 때 모든 UIBarButtonItem에 대한 명확한 전경색이 적용되지 않습니까? 따라서 텍스트가있는 UIBarButtonItem을 추가하면이 버튼의 전경색을 수동으로 변경해야합니까?
kuzdu

1
이것은 좋지만 뒤로 버튼을 누르면 여전히 텍스트가 표시됩니다
William T.

작동하지만 iOS 11에서 다른 바 버튼이 사라지도록합니다. 위의 Rafiqul Hasan의 답변으로 문제를 해결할 수 있습니다.
huync

6

ViewControllerA가 있고 ViewControllerB로 이동하려면 ViewControllerA에서 현재 navigationItem을 새 UIBarButtonItem으로 설정하고 제목을 공백이있는 문자열로 설정 한 후 다른보기 컨트롤러로 푸시해야합니다.

제목을 공백이있는 문자열로 설정하십시오. 기본값이 nil이므로 nil 또는 ""(빈 문자열)를 설정할 수 없습니다.

let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)

제목이 ""로 설정되어있는 경우에도 "뒤로"텍스트가 다시 나타나는 매우 재미있는 동작을 얻었 ViewControllerB습니다 (지금까지 항상 작동 했음에도 불구하고 내 특별한 경우). 나를 위해 일한 유일한 솔루션
10623169

6

이 코드를 각 VC에 넣으십시오.

navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

3
let button: UIButton = UIButton (type: UIButtonType.Custom)
button.setImage(UIImage(named: "imageName"), forState: UIControlState.Normal)
button.addTarget(self, action: "backButtonPressed:", forControlEvents: UIControlEvents.TouchUpInside)
button.frame = CGRectMake(0, 0, 30, 30)
let barButton = UIBarButtonItem(customView: button)

self.navigationItem.leftBarButtonItem = barButton

func backButtonPressed(btn : UIButton) {

    // Your code
}

3

탐색 컨트롤러 스택의 모든 뷰 컨트롤러에서 제거하려면 :

UINavigationController 하위 클래스를 만들고 다음을 추가합니다.

override func show(_ vc: UIViewController, sender: Any?) {
    setEmptyBackButton(vc)
    super.show(vc, sender: sender)
}

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    setEmptyBackButton(viewController)
    super.pushViewController(viewController, animated: animated)
}

func setEmptyBackButton(_ viewController: UIViewController) {
    viewController.navigationItem.backBarButtonItem =
        UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

2

제목이 긴 경우 제목 색상 만 변경하는 경우가 있습니다. 탐색 모음 제목이 왼쪽으로 이동할 수 있기 때문입니다. 따라서이를 방지하려면 바 버튼 제목을 투명하게 만드는 것 외에도 가로로 이동해야 할 수 있습니다.

let barButtonItemAppearance = UIBarButtonItem.appearance()
    barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
    barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)

2

세부

  • Xcode 버전 10.2.1 (10E1001), Swift 5

해결책

1. UINavigationController의 사용자 지정 클래스 만들기

import UIKit

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

2. UIViewController 확장 추가

import UIKit

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

3. ViewController 클래스 업데이트

import UIKit

class ViewController: UIViewController {
    override var navigationItemBackButtonTextIsHidden: Bool { return true }
}

전체 샘플

import UIKit

// MARK: - ViewController

class ViewController: UIViewController {

    var screenCounter = 1

    override func viewDidLoad() {
        super.viewDidLoad()
        setupNavigationItem()
    }

    override var navigationItemBackButtonTextIsHidden: Bool { return (screenCounter % 2) == 0 }
}

extension ViewController {

    private func setupNavigationItem() {
        navigationItem.title = "VC \(screenCounter)"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "push", style: .plain, target: self, action: #selector(pushBarButtonTouchedUpInside))
    }

    @objc func pushBarButtonTouchedUpInside(button: UIBarButtonItem) {
        guard let navigationController = navigationController else { return }
        let viewController = ViewController()
        viewController.screenCounter = screenCounter + 1
        viewController.view.backgroundColor = .white
        navigationController.pushViewController(viewController, animated: true)
    }
}

// MARK: - NavigationController

class NavigationController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}

extension NavigationController: UINavigationControllerDelegate {
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController.navigationItemBackButtonTextIsHidden {
            viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        }
    }
}

// MARK: - UIViewController extension

extension UIViewController {
    @objc var navigationItemBackButtonTextIsHidden: Bool { return false }
}

결과

여기에 이미지 설명 입력


2

의 대리자 메서드를 사용하여 뒤로 단추에서 텍스트를 제거 할 수 있습니다 UINavigationController.

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

}

extension CustomNavigationController: UINavigationControllerDelegate {
    
    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        viewController.navigationItem.backBarButtonItem = UIBarButtonItem(title: String(), style: .plain, target: nil, action: nil)
    }
    
}

1

나를 위해 이것은 트릭을했습니다.

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    self.navigationItem.title = " "
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.title = "my amazing title"
    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}

backBarButtonItem 을 수정하지 않고 제목 만 설정하면 작동하는 것처럼 보입니다 . 하지만 제스처를 사용하여 뒤로 돌아 가려고하면 취소 보다 하고 푸시 된 뷰 컨트롤러에 머무르면 뒤로 제목이 다시 표시됩니다.

Swift 4 에서 작업하기


설명해 주시겠습니까?
mrc

뒤로 버튼으로 항상 뒤로 텍스트를 표시하는 컨트롤러가 있습니다. 그래서 위의 코드 내 경우에는 작동하지 않습니다
Shahbaz 아크람

1

뒤로 버튼이 가리키는 컨트롤러의 탐색 모음을 선택하고 뒤로 버튼 필드에 ""를 입력해야합니다.

예를 들어 A 컨트롤러를 B 컨트롤러로 밀어 넣는 경우 A 컨트롤러 탐색 모음에 공백을 넣으십시오.


1

Xcode 10, Swift 4+

여기에있는 다른 사람들과 비슷한 대답이지만 텍스트가 여전히 지워지지 않으면 Space를 클릭 한 다음 Enter를 클릭해야한다는 점에 주목할 가치가 있습니다.

여기에 이미지 설명 입력


1

모두를 오버라이드 (override)하는 하나 개의 대안 ViewControllers내게는 연장했다 UINavigationController과 설정 backBarButtonItem의를 topViewController.

Swift 5 Xcode 11.2.1에서 :

extension UINavigationController {
    override open func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let backButton = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
        self.topViewController?.navigationItem.backBarButtonItem = backButton
    }
}

1

프로그래밍 방식으로이를 수행하는 가장 쉬운 방법 backBarButtonItem은 상위 뷰 컨트롤러 (푸시를 호출하는 컨트롤러)에서 설정하는 것입니다.

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        navigationItem.backBarButtonItem = backBarButtonItem
    }
}

자세한 내용은 여기 https://sarunw.com/posts/how-to-remove-text-from-uinavigationbar-back-button/


0

Swift가있는 Xcode 9.2에서는 다음과 같이 작동했습니다.

override func viewWillDisappear(_ animated: Bool) {
   super.viewWillDisappear(true)
   navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

0

이전 뷰 컨트롤러를 전혀 제어 할 수없는 경우 (즉, 프레임 워크에서 작업하는 경우) 다음과 같이 뒤로 버튼의 제목을 삭제할 수 있습니다.

// For iOS 10
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = String()

// For iOS 11
navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = nil

이 기능은 탐색 스택의 마지막 항목으로 이동하여 뒷면 제목을 삭제합니다. 뷰 컨트롤러가 나타날 때 원본을 저장하십시오.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    originalBackButtonTitle = navigationController?.navigationBar.items?.last?.backBarButtonItem?.title
    // Delete title somewhere here...
}

그런 다음 앱의 일부를 중단하지 않도록 다시 할당합니다.

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.items?.last?.backBarButtonItem?.title = originalBackButtonTitle
    super.viewWillDisappear(animated)
}

0

이렇게하면 문제가 해결됩니다.

    import UIKit

    extension UINavigationController{

    func customizeBackArrow(){
        let yourBackImage = UIImage(named: "icon_back_arrow")
        self.navigationBar.backIndicatorImage = yourBackImage
        self.navigationBar.tintColor = Common.offBlackColor
        self.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
        navigationItem.leftItemsSupplementBackButton = true
        self.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", 
           style: .plain, target: self, action: nil)

    }
}

0

몇 가지 답변을 시도했지만 모든 경우에 작동하도록 할 수는 없습니다. 따라서 이것은 설정된 경우 탐색 모음의 제목에 영향을주지 않는 해결 방법입니다.

    guard let items = viewController.navigationController?.navigationBar.items else { return }
    for item in items {
        if item.title == nil {
            item.title = ""
        }
    }

0

원치 않는 부작용이없는 쉬운 프로그래밍 방식 은 소스 컨트롤러 (탐색중인) 의 awakeFromNib 메서드에 있는 빈 항목으로 navigationItem.backBarButtonItem 을 초기화하는 것입니다 .

override func awakeFromNib() {
    super.awakeFromNib()
    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}

참고 : viewDidLoad () 메서드 에서와 같이 나중에 뒤로 버튼을 초기화하면 뒤로 스 와이프를 잃게됩니다. 기능을 (왼쪽 가장자리에서 오른쪽으로 스 와이프하면 탐색 스택에서 한 단계 뒤로 이동합니다).

그런 다음 다른 대상 컨트롤러에 대해 다른 뒤로 단추 텍스트를 원하고 segue를 사용하는 경우 다음과 같이 prepare (for segue :, sender :) 메서드 에서 제목을 설정할 수 있습니다 .

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let item = navigationItem.backBarButtonItem {
        switch segue.identifier {
        case "SceneOne": item.title = "Back"; break
        case "SceneTwo": item.title = "Home"; break
        case "SceneThree": item.title = nil; break // Use this scene's title
        default: item.title = "" // No text
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.