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


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.