Как получить экземпляр контроллера представления в классе UIButton, который создается из раскадровки - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь получить доступ к экземпляру viewController из класса UIButton, который находится в платформе. Всякий раз, когда button создается из раскадровки, вызывается init? (coder aDecoder: NSCoder). Но я не могу понять, как получить к нему доступ `viewController.

У меня есть пользовательский метод init init(viewController: UIViewController) в UIButton классе, который дает мне viewController, когда button создается программно.

например. let button = CustomButton(viewController: self)

Но теперь я хочу получить этот экземпляр viewController, когда button получил инициацию от раскадровки, то есть во время вызова init? (coder aDecoder: NSCoder).

До сих пор я получаю viewController объект, использующий это,

button.viewController = self

Но я думаю, что это плохая практика, чтобы получать вещи. Мне нужен альтернативный способ.

Любая помощь будет оценена. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Это свойство используется для получения ParentViewController (UIViewController) любого UIView.

extension UIResponder {  

var viewController:UIViewController? {

    if self.next is UIViewController {
        return self.next as? UIViewController
    } else {
        guard self.next != nil else { return nil }
        return self.next?.viewController
    }
}

}

0 голосов
/ 11 июля 2019

Наконец, с помощью моего друга «Панкаджа Баване» я получил это рабочее решение.

extension UIView {
    var parentViewController: UIViewController? {
        var parentResponder: UIResponder? = self
        while parentResponder != nil {
            parentResponder = parentResponder!.next
            if let viewController = parentResponder as? UIViewController {
                return viewController
            }
        }
        return nil
    }
}
0 голосов
/ 11 июля 2019

Я думаю, что вы можете использовать этот код:

extension UIView {
    func findViewController() -> UIViewController? {
        if let nextResponder = self.next as? UIViewController {
            return nextResponder
        } else if let nextResponder = self.next as? UIView {
            return nextResponder.findViewController()
        } else {
            return nil
        }
    }
}

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

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