Переход к ViewController Касание TableViewCell - PullRequest
0 голосов
/ 10 мая 2018

Как можно было бы перейти к контроллеру представления, нажав на ячейку табличного представления? Моя текущая структура:

Я использую navigation controller как единственный способ навигации по своему приложению.
Я использую view models типа struct для представления отдельных ячеек. Эти модели представления соответствуют пользовательскому протоколу, который состоит из метода, который я называю cellSelected.

Тогда у меня вопрос:
Как я могу перейти к view controller, нажав на ячейку, используя мою функцию cellSelected? Это возможно?

Пользовательский протокол:

protocol CellRepresentable
{
    var reuseIdentier: String { get }

    func registerCell(tableView: UITableView)
    func cellInstance(of tableView: UITableView, for indexPath: IndexPath) -> UITableViewCell
    func cellSelected()
}

Пример модели вида:

struct ProfileNameViewModel
{
}

extension ProfileNameViewModel: TextPresentable
{
    var text: String
    {
        return "Name"
    }
}

extension ProfileNameViewModel: CellRepresentable
{
    var reuseIdentier: String
    {
        get
        {
            return ProfileTableViewCell<ProfileNameViewModel>.reuseIdentifier
        }
    }

    func registerCell(tableView: UITableView)
    {
        tableView.register(ProfileTableViewCell<ProfileNameViewModel>.self, forCellReuseIdentifier: ProfileTableViewCell<ProfileNameViewModel>.reuseIdentifier)
    }

    func cellInstance(of tableView: UITableView, for indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentier, for: indexPath) as! ProfileTableViewCell<ProfileNameViewModel>
        cell.configure(withDelegate: self)

        return cell
    }

    func cellSelected()
    {
        // ?? 
    }
}

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Полагаю, у вас есть пара опций, вы можете либо передать ссылку вашего контроллера навигации на модель представления, либо вы можете определить замыкание, которое будет выполнено на cellSelected.

Вариант 1:

struct ProfileNameViewModel {

    private let navigationController: UINavigationController

    init(withNavigationController navigationController: UINavigationController) {
        self.navigationController = navigationController
    }

    func cellSelected() {
        navigationController.pushViewController(...)
    }
}

Вариант 2:

struct ProfileNameViewModel {

    private let selectedAction: () -> Void

    init(withSelectedAction selectedAction: @escaping () -> Void) {
        self.selectedAction = selectedAction
    }

    func cellSelected() {
        selectedAction()
    }
}

и на вашем контроллере представления:

let vm = ProfileNameViewModel(withSelectedAction: { [weak self] in
    self?.navigationContoller?.pushViewController(...)
})
0 голосов
/ 10 мая 2018

1- Перейдите в раскадровку, нажмите на свой viewController и в служебной области, которая находится слева от xcode, и дайте ему идентификатор раскадровки.
2 - вернитесь к своему коду и выполните его в cellSelected ()

скажем, ваш viewController называется MusicListVC

    func cellSelected() {

        if let viewController = storyboard?.instantiateViewController(withIdentifier: "your Identifier") as? MusicListVC
        {

            navigationController?.pushViewController(viewController , animated: true)
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...