只能在使用 hard-coded 字符串时更改 UIBarButton 标题

Only able to change UIBarButton title when using a hard-coded string

我有一个很常见的场景。基于数据的未知深度树,所以我有一个导航控制器,其中有一个 tableView 控制器作为根控制器。每次我需要更深入时,我都会创建一个新的 tableview 控制器,根据之前的选择用数据填充它,然后将新的 tableview 控制器推送到导航控制器堆栈:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let cell = tableView.cellForRowAtIndexPath(indexPath)
    let cellText = cell?.textLabel?.text 
    let bcti = CustomDataClass(querystring: cellText!)

    if(bcti.getStatus() == "Drill")
    {
        let bctvc = CustomTableViewControllerClass(tableinfo: bcti)

        //Note: self in this instance is my custom UITableViewController class
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: cellText, style: UIBarButtonItemStyle.Plain, target: nil, action: nil)

        self.navigationController?.pushViewController(bctvc, animated: true)

    }

这很好用,一个新的 tableview 控制器是基于从前一个控制器中选择的单元格创建的,将它推到导航堆栈上也很好用。奇怪的是我似乎无法让后栏项目显示从前一个控制器中选择的值。 如果我使用包含先前选定单元格文本的 cellText 变量(如上面的代码所示)来分配 UIBarButton title,它似乎会忽略它并默认使用 'Back' 作为标题。 cellText 变量显然有正确的值,我用 NSLog 语句验证,甚至尝试有条件地解包它以 100% 确定它在 run-time 处有一个值。它首先被用来取得进展,所以我认为我们可以排除一个可选的 nil 问题。

但对我来说真正奇怪的是 hard-coding 标题中的字符串工作得很好。因此,例如,如果我替换:

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

与:

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

它正确显示 Bananas 而不是 Back。我还可以声明一个具有不同值的变量和硬代码,并且它工作正常。即:

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

似乎只有当我尝试访问与它不起作用的单元格关联的文本时。

有人知道我在这里错过了什么吗?其他可能值得注意的是,我正在使用 Storyboard 来设置我的初始导航控制器和 tableview 控制器,我只是以编程方式创建 tableview 控制器的新实例。

查看 backBarButtonItem 的文档说明。单元格文本可能太长了。

与其尝试对相同的值进行硬编码,不如尝试更改数据源,使其具有非常短的文本值,然后看看它是否有效。例如。单元格现在可能显示多行文本的第一行,您可能只硬编码了第一行(唯一可见的)的副本。硬编码很糟糕,即使对于测试也是如此。