只能在使用 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 的文档说明。单元格文本可能太长了。
与其尝试对相同的值进行硬编码,不如尝试更改数据源,使其具有非常短的文本值,然后看看它是否有效。例如。单元格现在可能显示多行文本的第一行,您可能只硬编码了第一行(唯一可见的)的副本。硬编码很糟糕,即使对于测试也是如此。
我有一个很常见的场景。基于数据的未知深度树,所以我有一个导航控制器,其中有一个 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 的文档说明。单元格文本可能太长了。
与其尝试对相同的值进行硬编码,不如尝试更改数据源,使其具有非常短的文本值,然后看看它是否有效。例如。单元格现在可能显示多行文本的第一行,您可能只硬编码了第一行(唯一可见的)的副本。硬编码很糟糕,即使对于测试也是如此。