Представить модальное из модели представления UITableViewController - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть UITableViewController, это как класс ViewModel.Я пытаюсь создать свое приложение, используя шаблон MVVM .

В моем tableView есть ячейка, отображающая изображение, это изображение имеет распознаватель жестов, который вызывает метод в модели представления нанажмите.

На этом этапе я хотел бы представить ViewController модально, с некоторым встроенным содержимым.

Однако мой TableView cell соответствует UITableViewCell, поэтому я не могу вызвать подарок отсюда,

Моя ViewModel не соответствует чему-либо, поэтому я не могу также вызывать подарок оттуда.

Как я могу вызвать появление модала из UITableViewCell?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Добавьте расширение UIWindow

расширение UIWindow {

static var top: UIViewController? {
    get {
        return topViewController()
    }
}

static var root: UIViewController? {
    get {
        return UIApplication.shared.delegate?.window??.rootViewController
    }
}

static func topViewController(from viewController: UIViewController? = UIWindow.root) -> UIViewController? {
    if let tabBarViewController = viewController as? UITabBarController {
        return topViewController(from: tabBarViewController.selectedViewController)
    } else if let navigationController = viewController as? UINavigationController {
        return topViewController(from: navigationController.visibleViewController)
    } else if let presentedViewController = viewController?.presentedViewController {
        return topViewController(from: presentedViewController)
    } else {
        return viewController
    }
}

}

, чем вызывать его из любого места, например:

    guard let topController = UIWindow.top else  { return } // UIWindow.root
    let youVC = theStoryboard.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController
    youVC.modalTransitionStyle = .crossDissolve
    youVC.modalPresentationStyle = .overCurrentContext
    topController.present(youVC, animated: true, completion: nil)
0 голосов
/ 07 декабря 2018

У вас есть пара вариантов, но я расскажу о решении с делегатом.

Идея состоит в том, чтобы определить protocol и свойство этого протокола в MyViewModel и сделать MyViewController соответствующим ему.

Вот как может выглядеть MyViewModel:

protocol MyViewModelDelegate: class {
    func didTapOnCell()
}

class MyViewModel {
    // Please note the delegate is weak and optional
    weak var delegate: MyViewModelDelegate?

    // This function handle gesture recognizer taps
    @objc func handleImageViewTap() {
        delegate?.didTapOnCell()
    }

    // Here is the rest of the ViewModel class...
}

Затем в MyViewController вы устанавливаете свойство делегата viewModel на self и соответствует функции протокола (я предполагаю,контроллер представления ссылается на экземпляр модели представления).

class MyViewController: UITableViewController {

    func setup() {
        // ...
        // When MyViewModel is initialised, set the delegate property to self
        myViewModel.delegate = self
    }
}

extension MyViewController: ViewModelDelegate {
    func didTapOnCell() {
        // ...
        // Allocate instance of anotherViewController here and present it
        self.present(anotherViewController, animated: true, completion: .none)
    }
}

Таким образом, вы можете сообщить MyViewController что-то произошло в MyViewModel и действовать соответственно.

Обратите внимание, что необходимо сделать свойство delegate необязательным, чтобы избежать сохранения циклов.

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