【问题标题】:Swift change text of back button快速更改后退按钮的文本
【发布时间】:2015-11-12 14:40:33
【问题描述】:

我在更改导航栏中后退按钮的文本时遇到了一个小问题。我的应用看起来像这样:

-> Navigation Controller1 -> ViewController1 -> ViewController2 -显示详情> TabBarController -> NavigationController2 -> ViewController3 -> ViewController4

我通过添加更改了ViewController2 的后退按钮的文本

self.navigationItem.backBarButtonItem?.title = "Test"

ViewController1 进入viewDidLoad() 方法。但是我无法从ViewController4更改后退按钮的文字

我进行了一些研究并找到了一些解决方案,但它们对我不起作用。

我试过了:

App Delegate - 我遇到了崩溃:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Please file a radar on UIKit if you see this assertion.

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//Code       
 UIBarButtonItem.appearance().title = "Test"
//Code 
return true 
}

在推送中ViewController3 - 没有任何变化

    self.navigationItem.backBarButtonItem?.title = "Test"

NavigationController2 - 没有任何变化

    self.navigationItem.backBarButtonItem?.title = "Test"

NavigationController2 - 没有任何变化

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)

在我的 故事板 中更改 NavigationItem 中的文本 - 没有任何反应

最好的解决方案是将其设置在App Delegate 中。但我不能,因为它正在崩溃......

你知道我做错了什么吗?

崩溃日志:

2015-11-12 15:51:56.444 Name[2988:417662] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x22718f8f 0x30dc9c8b 0x22632c2b 0x262e55e7 0x260358b1 0x25f03439 0x262e2c83 0x25e40baf 0x25e406bb 0x2603f153 0x2603f0cb 0x25d9fd27 0x2605b987 0x2603efb7 0x25d9779d 0x25d96dc7 0x25d96ce1 0x25da154b 0x25da0f6b 0x25e2cf1f 0x25e2c917 0x25e2c6dd 0x25e2c19f 0x25e44a75 0x25e446b5 0x25e44649 0x25d97e43 0x257abd29 0x257a755d 0x257a73e5 0x257a6d81 0x257a6b6f 0x257a0849 0x226dedcd 0x226dc48b 0x226dc893 0x22628f31 0x22628d43 0x2a103201 0x25dfa879 0x10b778 0x3137baaf)
libc++abi.dylib: terminating with uncaught exception of type NSException

【问题讨论】:

  • 向我们展示应用委托中的代码。同时发布完整的崩溃日志
  • 如果你可以通过设置视图控制器1的标题来设置视图控制器2中的后退按钮,为什么不设置视图控制器3的标题来设置视图控制器4中的后退按钮的标题呢?
  • @MrT 在 AppDelegate 中更改后退按钮标题的代码如下所示: UIBarButtonItem.appearance().title = "Test" (如果我再次删除它,一切正常)。我在问题中添加了崩溃日志。
  • @keithbhunter "在推送的 ViewController3 中 - 没有任何变化" - self.navigationItem.backBarButtonItem?.title = "Test" (我正在将此代码添加到 ViewController3)
  • 设置视图控制器的标题而不是backBarButtonItem。喜欢self.title = "test" 而不是self.navigationItem.backBarButtonItem?.title = "Test"

标签: ios iphone swift back navigationbar


【解决方案1】:

由于目标控制器的后退栏按钮标题自动显示源控制器导航项的标题,一种方法是在源视图控制器中设置导航项的标题

  • viewWillAppear()viewDidAppear() 到普通标题。
  • prepareForSegue() 的标题中,应该显示后退栏按钮。

【讨论】:

  • 谢谢,这正在工作。我会做更多的研究,如果我没有找到任何“更清洁”的解决方案,我会使用你的。 :)
  • 如果您在viewWillAppear() 中写入正常标题,您将遇到如果用户玩回滑动游戏标题会更改的问题。我更喜欢写在viewDidAppear()
【解决方案2】:

我会这样做

在文件顶部为您的栏按钮创建一个新变量:

var leftBarButton: UIBarButtonItem!

然后设置按钮的属性

self.leftBarButton = UIBarButtonItem(title: "Your title", style: .Plain, target: self, action: "leftButtonAction")

最后在导航控制器中设置新的条形按钮

self.navigationItem.leftBarButtonItem = leftBarButton

希望对你有帮助!

【讨论】:

  • 我试过了,但对我不起作用。不过谢谢!
【解决方案3】:

这个解决方案对我有用:(在你推送的 ViewController 的 viewDidLoadviewWillAppear 中使用它)

let backButton = UIBarButtonItem()
    backButton.title = "Your text"
    backButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.red], for: .normal)
    navigationController?.viewControllers[(navigationController?.viewControllers.count)! - 2].navigationItem.backBarButtonItem = backButton

【讨论】:

    【解决方案4】:

    按照您概述转场的方式,ViewController3 似乎根本不应该有后退按钮。 Show Detail segue 替换 UISplitViewController 中的子视图控制器或以其他方式显示子视图。没有地方可以回去了。

    在 ViewController3 上的 viewDidLoad 内试试这个(使用 Swift 2 之前的语法):

    if let _ = self.navigationItem.backBarButtonItem {
        print("not nil")
    } else {
        print("nil")
    }
    

    当我在示例项目上尝试时,它是零。我认为这是核心问题。

    这点骇人听闻的作品:

    if let navButtons = self.navigationController?.navigationBar.items {
        if navButtons.count > 0 {
            navButtons[0].title = "Test"
        }
    }
    

    但是,这非常糟糕。操纵ViewController 的标题(根据@vadian 的建议)显然更干净。

    【讨论】:

    • 问题不是ViewController3,而是ViewController4。我想更改 ViewController4 的后退按钮。 (通常我必须在 ViewController3 中执行此操作,因为 ViewController3 正在推动 ViewController4。我知道这有点令人困惑,抱歉)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多