只能在使用硬编码字符串时更改UIBarButton标题

时间:2015-01-15 15:08:09

标签: ios swift uinavigationcontroller uibarbuttonitem

我有一个很常见的情况。基于数据的未知深度的树,因此我有一个导航控制器,其中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,那么它似乎会忽略它并默认为'无论如何,回到'作为标题。 cellText变量显然具有正确的值,我使用NSLog语句验证,甚至尝试有条件地展开它以100%确定它在运行时具有值。它首先被用于进步,所以我认为我们可以排除可选的nil问题。

对我来说真正奇怪的是,将字符串硬编码到标题中工作得很好。例如,如果我替换:

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)

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

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

似乎只有在我尝试访问与单元格关联的文本时才会起作用。

有谁知道我在这里缺少什么?可能值得注意的其他事情是我正在使用故事板来设置我的初始导航控制器和放大器。 tableview控制器,我只是以编程方式创建tableview控制器的新实例。

1 个答案:

答案 0 :(得分:0)

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

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