Переключить контроллер представления из класса TableViewCell в Swift - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы представить новый ViewController, когда пользователь щелкает элемент в tableviewcell. Однако стандартный код для запуска VC не работает из ячейки табличного представления или даже из вспомогательного класса, поскольку ни TVC, ни вспомогательный класс не могут представить контроллер представления.

Вот код вспомогательного класса. Помещенный в вспомогательный класс или ячейку таблицы, он не имеет существующего метода для запуска VC.

class launchVC {
 func launchVCNamed(identifier: String) {
    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let secondVC = storyBoard.instantiateViewController(withIdentifier: "contactDetail")
//FOLLOWING LINE HAS ERROR NO SUCH MEMBER (present)
    self.present(secondVC, animated: true, completion: nil)
    }
 }

Как я могу изменить это для запуска VC?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Добавьте делегата в вашу ячейку и назначьте его представителю VC.См. Ниже.

Использование делегирования

Создание пользовательской ячейки, наследуемой от UITableViewCell.

class CustomCell: UITableViewCell {
    var cellDelegate : CustomCellDelegate = nil

    @IBAction func elementTapped() {
        cellDelegate?.launchVC()
    }
}

Пользовательский делегат ячейки

protocol CustomCellDelegate {
    func launchVC()
}

MainViewController

class ViewController: UIViewController, UITableViewControllerDataSource, UITableViewDelegate {

    IBOutlet weak var tableView: UITableView!

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

    func numberOfSections(in: UITableView) -> Int {
        return 1
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? CustomCell {

            // important
            cell.delegate = self
            return cell
        }
    }
}

Расширение ViewController для реализации протокола

extension ViewContrller: CustomCellDelegate {
    func launchVC() {
        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "SecondViewController")
        self.present(vc, animated: true, completion: nil)
    }
}
0 голосов
/ 19 ноября 2018

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

class SomeCell: UITableViewCell {
    var actionBlock = { }

    func someActionOccured() { // some action like button tap in cell occured
        actionBlock()
    }
}

А в cellForRow в контроллере представления необходимо назначить замыкание

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! SomeCell // replace cell identifier with whatever your identifier is
    cell.actionBlock = { [unowned self] in 
        let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let secondVC = storyBoard.instantiateViewController(withIdentifier: "contactDetail")
        self.present(secondVC, animated: true, completion: nil)
    }
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...