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

Posted

技术标签:

【中文标题】只能在使用硬编码字符串时更改 UIBarButton 标题【英文标题】:Only able to change UIBarButton title when using a hard-coded string 【发布时间】:2015-01-15 15:08:08 【问题描述】:

我有一个很常见的场景。基于数据的未知深度树,所以我有一个导航控制器,其根控制器为 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)

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

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

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

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

【问题讨论】:

您检查过 cellText 变量以了解其实际值吗? @PeterSegerblom 是的,正如我所提到的,我使用显示展开值的 NSLog 检查了它,并且我还尝试使用条件展开设置标题(即:if let test = cellTextself .navigationItem.backBarButtonItem = UIBarButtonItem(title:test,... 查看backBarButtonItem 的the documentation 的内容。单元格文本可能太长了。 @A-Live 我忘了提到这一点,但我也尝试过硬编码单元格文本的确切值。并且硬编码相同的值可以正常工作,所以我认为在这种情况下字符串的长度不是问题。 不要尝试硬编码相同的值,而是尝试更改数据源,使其具有非常短的文本值,看看它是否有效。例如。单元格现在可能正在显示多行文本的第一行,并且您可能已经硬编码了仅第一行(唯一可见的)行的副本。硬编码很糟糕,即使对于测试也是如此。 【参考方案1】:

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

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

【讨论】:

以上是关于只能在使用硬编码字符串时更改 UIBarButton 标题的主要内容,如果未能解决你的问题,请参考以下文章

更改 javascript 文件中的硬编码 ID

本机 MongoDB:为啥我的 switch 语句不能使用字段名称,而只能使用硬编码值?

如何在 XSLT 条件下更改硬编码元素的位置?

使用 Hive 日期函数而不是硬编码日期字符串时,Hive 查询性能很慢?

是否有更改 plot.svm 硬编码标题的解决方法?

在 ASP.NET Core 中替换硬编码字符串都有哪些好的做法?