Ios 从外部访问视图/视图控制器?

Ios 从外部访问视图/视图控制器?,ios,swift,uiview,uiviewcontroller,Ios,Swift,Uiview,Uiviewcontroller,在我的应用程序中,我有一个自定义视图CustomViewA,其中包含并委托给另一个视图CustomViewB 最后,应在包含的视图控制器上接收CustomViewB的结果,MyViewController 我最近遇到了一种访问单视图父视图控制器的简便方法,如下所示: extension UIResponder { var parentViewController: UIViewController? { return next as? UIViewController ?

在我的应用程序中,我有一个自定义视图
CustomViewA
,其中包含并委托给另一个视图
CustomViewB

最后,应在包含的视图控制器上接收
CustomViewB
的结果,
MyViewController

我最近遇到了一种访问单视图父视图控制器的简便方法,如下所示:

extension UIResponder {
    var parentViewController: UIViewController? {
        return next as? UIViewController ?? next?.parentViewController
    }
}
所以这看起来像是一种奇怪的做法,但是写这样的东西有什么负面影响吗

// CustomViewA.swift
func protocolActionFromCustomViewB(objectToPass: CustomObject) {
    if let parent = self.parentViewController as? MyViewController {
        parent.performAction(with: objectToPass)
    }
}
创建另一个特定协议或发送通知

同样,从视图的superview访问值或调用函数是否有任何负面影响?像这样:

if let superview = superview as? MyCustomView {
    let object = superview.someObject
    superview.someFunction()
    ...
}

提前谢谢。

肯定有缺点。当您将子视图嵌套到其他视图(例如滚动视图)中时,这将中断。
NotificationCenter
可能是一种方法,使用另一个委托可能是另一种方法,我已经采取直接分配回调闭包/函数(这是一种简单的委托形式)的方式,我建议不要使用NotificationCenter。它确实模糊了代码之间的连接。我认为最好直接注册
CustomViewB
作为
CustomViewA
的代表(在制定了一些
CustomVewADelegate
协议,并扩展
CustomViewB
以符合它之后)。它清晰、直接、高效且易于调试。@Alexander情况是,
CustomViewB
总是由
CustomViewA
授权,其中,
CustomViewA
是视图控制器的直接子视图,
CustomViewB
CustomViewA
的子视图,我需要将
CustomViewB
上的对象获取到视图控制器。因此,我只是想寻找其他选项,而不是堆积多个委托,这会很麻烦。@Eilon您能详细说明一下“最终,CustomViewB的结果应该在包含的视图控制器MyViewController上接收”的确切含义吗您是否在谈论对
CustomViewB
的委托方法调用的结果,以及您希望
MyViewController
使用该结果?肯定存在不利因素。当您将子视图嵌套到其他视图(例如滚动视图)中时,这将中断。
NotificationCenter
可能是一种方法,使用另一个委托可能是另一种方法,我已经采取直接分配回调闭包/函数(这是一种简单的委托形式)的方式,我建议不要使用NotificationCenter。它确实模糊了代码之间的连接。我认为最好直接注册
CustomViewB
作为
CustomViewA
的代表(在制定了一些
CustomVewADelegate
协议,并扩展
CustomViewB
以符合它之后)。它清晰、直接、高效且易于调试。@Alexander情况是,
CustomViewB
总是由
CustomViewA
授权,其中,
CustomViewA
是视图控制器的直接子视图,
CustomViewB
CustomViewA
的子视图,我需要将
CustomViewB
上的对象获取到视图控制器。因此,我只是想寻找其他选项,而不是堆积多个委托,这会很麻烦。@Eilon您能详细说明一下“最终,CustomViewB的结果应该在包含的视图控制器MyViewController上接收”的确切含义吗您是否在谈论对
CustomViewB
的委托方法调用的结果,以及希望
MyViewController
使用该结果?