获取parentViewController实例

时间:2018-01-22 11:20:29

标签: ios swift

我有两个课程:MyViewController: UIViewControllerTheView: UIView。在MyViewController里面我声明并对象var theView: TheView和一个布尔标志如var flag: Bool = false。如何从flag类中获取TheView值而不从MyViewController传递?我尝试过像if let vc = self.parentViewController as? MyViewController { }这样的方法,但没有成功。

3 个答案:

答案 0 :(得分:0)

很难获得对视图相关控制器的引用这一事实应该暗示它是不好的做法。最好将父视图控制器传递到视图的初始化器并将其存储为弱引用。

class TheView: UIView {
    weak var parentViewController: MyViewController?

    init(parentViewController: MyViewController) {
        self.parentViewController = parentViewController
    }
}

// in MyViewController...
let view = TheView(parentViewController: self)

答案 1 :(得分:0)

最好的方法是在TheView中声明一个引用父项的变量,并在实例化TheView时设置它:

var parentController: MyViewController?

然后,当您实例化View时,您可以附加父级:

// Instantiate your view either view storyboard or code and then:
self.theView.parentController = self

答案 2 :(得分:0)

从视图中获取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
        }
    }
}

你的ParentViewController就像。

class ViewController: UITableViewController {

var theView: TheView = TheView()
override func viewDidLoad() {
    super.viewDidLoad()

    self.view.addSubview(theView)
}