뒤로 버튼에서 텍스트를 제거하고 싶지만 아이콘은 유지하고 싶습니다. 나는 시도했다
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
그러나 이렇게하면 텍스트와 아이콘이 완전히 제거됩니다.
뒤로 버튼에서 텍스트를 제거하고 싶지만 아이콘은 유지하고 싶습니다. 나는 시도했다
let backButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: navigationController, action: nil)
navigationItem.leftBarButtonItem = backButton
그러나 이렇게하면 텍스트와 아이콘이 완전히 제거됩니다.
답변:
이미 답이 있다는 것을 알고 있지만 코드로도 할 수 있습니다 (펜촉으로 작업하는 경우)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
첫 번째 뷰 컨트롤러에 위를 추가하십시오.
푸시하는 각 뷰 컨트롤러에 대해이 작업을 수행해야합니다. 따라서 3 개의 뷰 컨트롤러가 있고 이들 모두에서 백 텍스트를 제거하려면 뷰 컨트롤러 1과 2에 줄을 추가해야합니다.
.Plain
로 변경되었습니다 .plain
. 자본금 없음 p.
많이 검색 한 후 가장 좋고 간단한 해결책을 찾았습니다. 이는 Swift 4.2로 작성되고 Swift 5에서 작동하는 모든 viewController에 영향을 미칩니다.
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
뒤로 버튼의 텍스트는 마스터보기의 제목에 따라 다릅니다.
요령은 마스터 뷰가 사라지면 제목을 지우고 다시 표시되면 다시 설정하는 것입니다.
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"
}
당신이 밀어 뷰 컨트롤러에서 뒤로 버튼의 제목을 제거하고 싶다면,의 말을하자 <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)
}
.Plain
로 변경되었습니다 .plain
. 자본금 없음 p.
뒤로 화살표를 원하면 다음 코드를 AppDelegate 파일에 didFinishLaunchingWithOptions 메서드에 넣습니다.
Swift 용
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
제 경우에는 사용자 정의 아이콘과 제목에 대해 이것이 트릭을 수행했습니다 (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)
마침내 완벽한 솔루션을 찾았습니다.
투명한 이미지 하나를 추가하고 AppDelegate에 다음 코드를 추가하기 만하면됩니다.
UIBarButtonItem.appearance().setBackButtonBackgroundImage(#imageLiteral(resourceName: "transparent"), for: .normal, barMetrics: .default)
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment
대부분의 다른 답변이 권장 하는 해킹을 사용 했지만 긴 제목을 가진 뷰 컨트롤러의 경우 iPhone X에서 손상되었습니다. 이 솔루션은 완벽하게 작동합니다.
신속한 4
self.navigationController?.navigationBar.topItem?.title = ""
이것은 나를 위해 일하고 있습니다
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.topItem?.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
들어 스위프트 4+ 이 줄을 넣어 AppDelegate
에서didFinishLaunchingWithOptions
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
BarButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
ViewControllerA가 있고 ViewControllerB로 이동하려면 ViewControllerA에서 현재 navigationItem을 새 UIBarButtonItem으로 설정하고 제목을 공백이있는 문자열로 설정 한 후 다른보기 컨트롤러로 푸시해야합니다.
제목을 공백이있는 문자열로 설정하십시오. 기본값이 nil이므로 nil 또는 ""(빈 문자열)를 설정할 수 없습니다.
let backItem = UIBarButtonItem()
backItem.title = " "
navigationItem.backBarButtonItem = backItem
let controllerB = ViewControllerB()
navigationController?.pushViewController(controllerB, animated: true)
ViewControllerB
습니다 (지금까지 항상 작동 했음에도 불구하고 내 특별한 경우). 나를 위해 일한 유일한 솔루션
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
}
탐색 컨트롤러 스택의 모든 뷰 컨트롤러에서 제거하려면 :
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)
}
제목이 긴 경우 제목 색상 만 변경하는 경우가 있습니다. 탐색 모음 제목이 왼쪽으로 이동할 수 있기 때문입니다. 따라서이를 방지하려면 바 버튼 제목을 투명하게 만드는 것 외에도 가로로 이동해야 할 수 있습니다.
let barButtonItemAppearance = UIBarButtonItem.appearance()
barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
barButtonItemAppearance.setBackButtonTitlePositionAdjustment(UIOffsetMake(-200, 0), for:UIBarMetrics.default)
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 }
}
의 대리자 메서드를 사용하여 뒤로 단추에서 텍스트를 제거 할 수 있습니다 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)
}
}
나를 위해 이것은 트릭을했습니다.
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 에서 작업하기
모두를 오버라이드 (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
}
}
프로그래밍 방식으로이를 수행하는 가장 쉬운 방법 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/
이전 뷰 컨트롤러를 전혀 제어 할 수없는 경우 (즉, 프레임 워크에서 작업하는 경우) 다음과 같이 뒤로 버튼의 제목을 삭제할 수 있습니다.
// 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)
}
이렇게하면 문제가 해결됩니다.
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)
}
}
몇 가지 답변을 시도했지만 모든 경우에 작동하도록 할 수는 없습니다. 따라서 이것은 설정된 경우 탐색 모음의 제목에 영향을주지 않는 해결 방법입니다.
guard let items = viewController.navigationController?.navigationBar.items else { return }
for item in items {
if item.title == nil {
item.title = ""
}
}
원치 않는 부작용이없는 쉬운 프로그래밍 방식 은 소스 컨트롤러 (탐색중인) 의 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
}
}
}