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,在那里我写下了我使用的解决方案。顺便说一句,谢谢!