navigationItem.title from UITableViewCell



导航栏标题未根据所选单元格显示。

我在容器视图中有导航视图控制器。容器视图位于 ViewController 中。

视图控制器:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "embedseg" {
        guard let splitViewController = segue.destination as? UISplitViewController,
            let leftNavController = splitViewController.viewControllers.first as? UINavigationController,
            let masterViewController = leftNavController.topViewController as? MasterViewController,
            //let detailViewController = splitViewController.viewControllers.last as? DetailViewController
            let rightNavController = splitViewController.viewControllers.last as? UINavigationController,
            let detailViewController = rightNavController.topViewController as? DetailViewController
            else { fatalError() }
        let firstMonster = masterViewController.monsters.first
        detailViewController.monster = firstMonster
        masterViewController.delegate = detailViewController
        detailViewController.navigationItem.leftItemsSupplementBackButton = true
        detailViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
        //detailViewController.navigationItem.title = "Hello" <-- tested this, it worked.
        //detailViewController.navigationItem.title = cell.textLabel?.text <-- this didn't work.
        //detailViewController.navigationItem.title = monster.name <-- and this didn't work.                        
    }
}

主视图控制器:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let monster = monsters[indexPath.row]
    cell.textLabel?.text = monster.name
    return cell
}

当您选择单元格时

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     let cell = tableView.cellForRow(at: indexPath) as! YourCellClassName
     self.performSegue(withIdentifier: "embedseg", sender:cell.textLabel?.text)
}

在准备Segue

let cellText = sender as! String
detailViewController.navigationItem.title = cellText 

发生这种情况是因为monstercell是在内部定义的

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}

但不在里面

override func prepare(for segue: UIStoryboardSegue, sender: Any?){}

如果您使用情节提要设置了 segue,则可以执行以下操作:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    if let cell = sender as? UITableViewCell {
        detailViewController.navigationItem.title = cell.textLabel?.text
    }
}

或类似这样的东西:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    if let cell = sender as? UITableViewCell {
        let indexPath = tableView.indexPath(for: cell)
        detailViewController.navigationItem.title = monsters[indexPath.row].name
    }
}
在第一种情况下,您将"sender"转换为单元格,

以便您可以访问其值,在第二种情况下,您将"sender"转换为单元格,找到它的indexPath,然后使用indexPath使用数组找到正确的"怪物"monsters

最新更新