我有一个指向UIView
的指针。如何访问它的UIViewController
?[self superview]
是另一个UIView
,但不是UIViewController
,对吧?
发布于 2009-09-03 12:12:34
是的,superview
是包含您的视图的视图。你的视图不应该确切知道哪个是它的视图控制器,因为这会违反MVC原则。
另一方面,控制器知道它负责哪个视图(self.view = myView
),通常,此视图将方法/事件委托给控制器处理。
通常,您应该有一个指向控制器的指针,而不是指向视图的指针,控制器可以执行某些控制逻辑,也可以将某些内容传递给视图。
发布于 2016-01-27 20:52:17
要获得具有UIView的UIViewController的引用,您可以扩展UIResponder (这是UIView和UIViewController的超类),它允许通过响应器链向上移动,从而到达UIViewController(否则返回nil)。
extension UIResponder {
func getParentViewController() -> UIViewController? {
if self.nextResponder() is UIViewController {
return self.nextResponder() as? UIViewController
} else {
if self.nextResponder() != nil {
return (self.nextResponder()!).getParentViewController()
}
else {return nil}
}
}
}
//Swift 3
extension UIResponder {
func getParentViewController() -> UIViewController? {
if self.next is UIViewController {
return self.next as? UIViewController
} else {
if self.next != nil {
return (self.next!).getParentViewController()
}
else {return nil}
}
}
}
let vc = UIViewController()
let view = UIView()
vc.view.addSubview(view)
view.getParentViewController() //provide reference to vc
发布于 2017-03-30 00:07:11
Swift 3中快速而通用的方式:
extension UIResponder {
func parentController<T: UIViewController>(of type: T.Type) -> T? {
guard let next = self.next else {
return nil
}
return (next as? T) ?? next.parentController(of: T.self)
}
}
//Use:
class MyView: UIView {
...
let parentController = self.parentController(of: MyViewController.self)
}
https://stackoverflow.com/questions/1372977
复制相似问题