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
使用该结果?