Как показать новый View Controller при нажатии ячейки табличного представления в Swift - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь показать новый контроллер представления при щелчке ячейки табличного представления. Но моя проблема в том, что когда я щелкаю ячейку табличного представления, новый контроллер представления не появляется. Я уже смотрел на решения для SO, но он не работал.

Вот скриншот раскадровки enter image description here

А вот соответствующий код:

import UIKit

class RestaurantTableViewController: UITableViewController {

    let cellIdentifier: String = "restaurantCell"


    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.delegate = self
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "restaurantSegue" {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let destination = storyboard.instantiateViewController(withIdentifier: "RestaurantInfoViewController") as! RestaurantInfoViewController
            navigationController?.pushViewController(destination, animated: true)
        }
    }
}

extension RestaurantTableViewController {

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! RestaurantTableViewCell

        return cell
    }

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        // Return false if you do not want the specified item to be editable.
        return true
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.performSegue(withIdentifier: "restaurantSegue", sender: self)
    }

}

Примечание: я также следовал документации Apple в ссылке Руководство Apple . Но это не сработало

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Согласно скриншоту, последовательность подключена к ячейке табличного представления.

Если это так, удалите didSelectRowAt, потому что последовательность выполнена напрямую

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "restaurantSegue", sender: self)
}  

Вторая проблема заключается в том, что если вы используете переход, вы должны не позвонить instantiateViewController.

Если вы не нужно передавать данные в следующий контроллер вида, который вы можете даже удалить

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "restaurantSegue" {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let destination = storyboard.instantiateViewController(withIdentifier: "RestaurantInfoViewController") as! RestaurantInfoViewController
        navigationController?.pushViewController(destination, animated: true)
    }
}  

В противном случае получите контроллер destination из сеанса в prepare(for и используйте его.

Если переход еще не выполнен, значит, с идентификатором что-то не так.

0 голосов
/ 15 января 2020

Вам просто нужно сделать segue.destination в качестве вашего viewcontroller, не нужно его sh. Метод executeSegue позаботится об этом. Как это:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "restaurantSegue" {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            segue.destination =  storyboard.instantiateViewController(withIdentifier: "RestaurantInfoViewController") as! RestaurantInfoViewController

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...