无法在初始加载时以编程方式设置UINavigationItem标题

时间:2015-09-25 00:38:36

标签: ios swift uitableview segue navigationitem

我正在从TableViewController(嵌入在NavigationController中)到另一个TableViewController执行segue(通过故事板)。 I.e选择一个单元格并显示另一个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,设置navigationItem标题。

var passedValue: String?

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationItem.title = passedValue
}

1 个答案:

答案 0 :(得分:1)

这是因为prepareForSeguedidSelectRowAtIndexPath之前被称为。因此,当您第一次选择行时,valueToPass为零。当prepareForSegue仍然为零时调用valueToPass,然后传递它,然后在您通过后didSelectRowAtIndexPathvalueToPass设置为所需的值,这就是&#39 ; s在下次选择一行时通过。

您需要在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

    }
}