我正在尝试从框架中的viewController
类访问UIButton
的实例。每当从情节提要中实例化button
时,就会调用init? (coder aDecoder: NSCoder)
。但是我不明白如何从中访问`viewController。
我在init(viewController: UIViewController)
类中有一个自定义的初始化方法UIButton
,当viewController
以编程方式实例化时,它为我提供了button
。
例如let button = CustomButton(viewController: self)
但是现在我想在viewController
通过情节提要(即在button
调用时)初始化时获得此init? (coder aDecoder: NSCoder)
实例。
直到现在,我正在使用此对象viewController
,
button.viewController = self
但是我认为这不是获取事物的好习惯。我需要另一种方法。
任何帮助将不胜感激。预先感谢。
答案 0 :(得分:0)
我认为您可以使用以下代码:
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
}
}
}
但是,总的来说,您应该考虑为什么需要它,还有另一种方法可以做到。例如,您可以将委托传递给负责此导航的按钮。
答案 1 :(得分:0)
此属性用于获取任何UIView的ParentViewController(UIViewController)。
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
}
}
}
答案 2 :(得分:0)
最后,在我的朋友“ Pankaj Bawane”的帮助下,我得到了这个可行的解决方案。
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
}
}