无法在初始加载时以编程方式设置 UINavigationItem 标题
Can't set UINavigationItem title programatically on initial load
我正在执行从 TableViewController(嵌入在 NavigationController 中)到另一个 TableViewController 的转接(通过故事板)。即选择一个单元格并呈现另一个 TableView,我想在其上显示所选单元格的文本作为下一个视图标题。
我正在实现这一点,但不是 100% 正确。在第一次初始选择单元格时,未设置 navigationItem 标题。只有当我通过同一个单元格向后导航然后再次向前导航时,标题才会设置。
第一个片段是我的第一个 viewController,我选择了一个单元格,我在其中设置了带有所选单元格标题的 destinationViewControllers 变量。
var valueToPass:String?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("You selected cell #\(indexPath.row)!")
// Get Cell Label
let indexPath = tableView.indexPathForSelectedRow!;
let currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!;
valueToPass = currentCell.textLabel!.text
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "tripSegue") {
// initialize new view controller and cast it as your view controller
let viewController = segue.destinationViewController as! TripTableViewController
// setting the view controllers property that will store the passed value
viewController.passedValue = valueToPass
}
}
第二个片段来自设置导航项标题的 destinationViewController。
var passedValue: String?
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = passedValue
}
这是因为 prepareForSegue
在 didSelectRowAtIndexPath
之前被调用 。所以你第一次 select 一行时,valueToPass
是零。 prepareForSegue
被调用,而 valueToPass
仍然是 nil 并且你传递它,然后在你传递之后, didSelectRowAtIndexPath
被调用设置 valueToPass
到所需的值,这就是传递的值下次你 select 一行。
您需要在 prepareForSegue
中完成所有操作。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "tripSegue") {
// Get Cell Label
let indexPath = self.tableView.indexPathForSelectedRow!;
let currentCell = self.tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!;
// initialize new view controller and cast it as your view controller
let viewController = segue.destinationViewController as! TripTableViewController
// setting the view controllers property that will store the passed value
viewController.passedValue = currentCell.textLabel!.text
}
}
我正在执行从 TableViewController(嵌入在 NavigationController 中)到另一个 TableViewController 的转接(通过故事板)。即选择一个单元格并呈现另一个 TableView,我想在其上显示所选单元格的文本作为下一个视图标题。
我正在实现这一点,但不是 100% 正确。在第一次初始选择单元格时,未设置 navigationItem 标题。只有当我通过同一个单元格向后导航然后再次向前导航时,标题才会设置。
第一个片段是我的第一个 viewController,我选择了一个单元格,我在其中设置了带有所选单元格标题的 destinationViewControllers 变量。
var valueToPass:String?
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("You selected cell #\(indexPath.row)!")
// Get Cell Label
let indexPath = tableView.indexPathForSelectedRow!;
let currentCell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!;
valueToPass = currentCell.textLabel!.text
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "tripSegue") {
// initialize new view controller and cast it as your view controller
let viewController = segue.destinationViewController as! TripTableViewController
// setting the view controllers property that will store the passed value
viewController.passedValue = valueToPass
}
}
第二个片段来自设置导航项标题的 destinationViewController。
var passedValue: String?
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = passedValue
}
这是因为 prepareForSegue
在 didSelectRowAtIndexPath
之前被调用 。所以你第一次 select 一行时,valueToPass
是零。 prepareForSegue
被调用,而 valueToPass
仍然是 nil 并且你传递它,然后在你传递之后, didSelectRowAtIndexPath
被调用设置 valueToPass
到所需的值,这就是传递的值下次你 select 一行。
您需要在 prepareForSegue
中完成所有操作。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "tripSegue") {
// Get Cell Label
let indexPath = self.tableView.indexPathForSelectedRow!;
let currentCell = self.tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell!;
// initialize new view controller and cast it as your view controller
let viewController = segue.destinationViewController as! TripTableViewController
// setting the view controllers property that will store the passed value
viewController.passedValue = currentCell.textLabel!.text
}
}