Ios 获取parentViewController实例
我有两个类:Ios 获取parentViewController实例,ios,swift,Ios,Swift,我有两个类:MyViewController:UIViewController和TheView:UIView。在MyViewController中,我声明了和对象var theView:theView和一个布尔标志,如var flag:Bool=false。如何从视图类内部获取标志值,而不从MyViewController传递if?我尝试过类似于if let vc=self.parentViewController as?MyViewController{}但未成功。很难获得视图关联控制器的引用
MyViewController:UIViewController
和TheView:UIView
。在MyViewController
中,我声明了和对象var theView:theView
和一个布尔标志,如var flag:Bool=false
。如何从视图类内部获取标志
值,而不从MyViewController
传递if?我尝试过类似于if let vc=self.parentViewController as?MyViewController{}
但未成功。很难获得视图关联控制器的引用这一事实应该是一个提示,说明这是一种不好的做法。最好将父视图控制器传递到视图的初始化器中,并将其存储为弱引用
class TheView: UIView {
weak var parentViewController: MyViewController?
init(parentViewController: MyViewController) {
self.parentViewController = parentViewController
}
}
// in MyViewController...
let view = TheView(parentViewController: self)
最好的方法是在视图中声明一个引用父级的变量,并在实例化视图时设置该变量:
var parentController: MyViewController?
然后,在实例化视图时,可以附加父视图:
// Instantiate your view either view storyboard or code and then:
self.theView.parentController = self
从视图中获取
parentViewController
,然后使用此扩展名
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
}
}
获取一个类似这样的UIView
parentViewController
class TheView: UIView {
func teset(){
if let vc = self.parentViewController as? ViewController {
//Sccess block
}
}
}
你的父母喜欢
class ViewController: UITableViewController {
var theView: TheView = TheView()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(theView)
}
我接受了这个答案,因为我想象这是一个糟糕的做法。我在视图中添加了一个标志,并从视图的实例中设置它。谢谢实际上,我们可以使用UIViewController的父属性。但是我们需要确保正确地建立了child和root之间的关系(使用addChildViewController和didMoveToParentViewController方法…),我不建议在UIView知道ViewController的情况下使用这种依赖关系,因为这会降低模块的可重用性。你尝试过委托模式吗?当然,但这是我想到的第一个解决方案。我已经评论了@Samah answer,在那里我写下了我使用的解决方案。顺便说一句,谢谢!