navigationItem.title из 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
}

person Tom    schedule 24.03.2018    source источник


Ответы (2)


Когда вы выбираете ячейку

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

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

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

в подготовке к переходу

let cellText = sender as! String

detailViewController.navigationItem.title = cellText 
person Sh_Khan    schedule 24.03.2018
comment
Разве это не вызовет prepareForSegue дважды, если он установит переходы, используя раскадровки? - person Ezek55; 24.03.2018
comment
в раскадровке переход может быть присоединен к действию элемента управления, иначе он должен сделать это с помощью performSegue в коде - person Sh_Khan; 24.03.2018

Это происходит потому, что monster и cell определены внутри

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

но не внутри

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

Если вы установили свои переходы с помощью раскадровки, вы можете сделать что-то вроде этого:

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

В первом случае вы указываете «отправитель» как ячейку, чтобы получить доступ к ее значениям, во втором случае вы указываете «отправитель» как ячейку, вы находите ее indexPath, а затем используете indexPath, чтобы найти правильный «монстр». "используя ваш массив monsters

person Ezek55    schedule 24.03.2018