Tom
Tom

Reputation: 85

navigationItem.title from UITableViewCell

Navigation Bar title is not appearing according to the Selected Cell.

I have the Navigation View Controller inside a Container View. The Container View is in ViewController.

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.                        
    }
}

MasterViewController:

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
}

Upvotes: 0

Views: 201

Answers (2)

Azephiar
Azephiar

Reputation: 501

This happens because monster and cell are defined inside

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

but not inside

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

If you have set your segues using the storyboard you can do something like this:

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

or something like this:

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
    }
}

In the first case you cast "sender" as the cell so you can access it's values, in the second case you cast "sender" as the cell, you find what is it's indexPath and then you use the indexPath to find the correct "monster" using you array monsters

Upvotes: 0

Shehata Gamal
Shehata Gamal

Reputation: 100503

When you select the cell

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

     let cell = tableView.cellForRow(at: indexPath) as! YourCellClassName

     self.performSegue(withIdentifier: "embedseg", sender:cell.textLabel?.text)
}

in prepareforSegue

let cellText = sender as! String

detailViewController.navigationItem.title = cellText 

Upvotes: 0

Related Questions