UIView 和子视图代表
Posted
技术标签:
【中文标题】UIView 和子视图代表【英文标题】:UIView & Subview Delegates 【发布时间】:2015-09-29 04:37:23 【问题描述】:我只是想澄清一下我对委托模式的一些困惑,当这些视图有多个 UIView 和 Subview 时应该构建委托模式。为了清楚起见,让我们定义一些变量。
让我们将这些对象定义为:
视图控制器A
UIViewB
子视图C
现在,我了解了委托模式的工作原理(我认为),尽管我不确定如何在嵌套的 UIView 中实现此模式。我的一些问题是:
C
是否应该包含由其超级视图 (B
) 实现的委托?
如果是,B
是否应该将此信息传递给它的委托 ViewController (A
)?
这是一个场景,假设C
有一个 UITextView,这个文本视图的高度由从 API 服务获取的字符串确定。 B
无权访问 API,因为这项工作应该通过 ViewController (A
) 完成。
C
应该包含一个指向:
ViewController 的 (
A
) 委托实现? UIView 的 (B
) 委托实现? 其他?
如果答案是 (2),那么 B
是否应该调用 ViewController (A
) 并通过一系列事件传递此信息?
这是一个小的视觉效果:
A <IBDelegate>
B <ICDelegate> C 呼叫Delegate.OnApiComplete(float height);
在这种情况下,“代表”是什么? (ICDelegate
或 IBDelegate
)。事件链是什么?
我只是想避免任何不必要的逻辑渗透到 UIView 中,而责任应该在控制器上。
我知道你可以通过 UIView 之间的共享对象来解决大部分场景,但是当涉及到网络服务时,这些值需要通过某种回调来检索。
我需要进一步澄清,让我知道。非常感谢任何帮助。
【问题讨论】:
我认为您可以单独创建 .h 文件并在该类中创建协议。无论您想在哪里实现这些协议方法,导入 .h 类并声明协议并实现该方法。你可以通过创建协议对象从任何地方调用。 【参考方案1】:所以,你有这样的情况:
视图控制器 A --> 视图 B --> 视图 C
我会尽量确保我的ViewController A
为View B
和View C
做出这样的决定:
-
创建协议
ViewDelegate
并同时保留View B
和View C
委托其中的方法。
在View B
中创建属性@property (nonatomic, weak) id <ViewDelegate> delegate;
。
在View C
中创建属性@property (nonatomic, weak) id <ViewDelegate>
delegate;
。
从ViewController A
实例化View B
时将self
设置为委托。喜欢viewBObj.delegate = self
。
从View B
实例化View C
时将self.delegate
设置为委托。喜欢viewBObj.delegate = self.delegate
。
这将使ViewController A
同时响应View B
和View C
委托事件。
【讨论】:
是的,我明白这一点,但在我的情况下,视图 C 嵌套在视图 B 中。按照你将如何拥有一个包含 UITableView 的 UIView 的思路,在这种情况下,UIView 将实现委托正确吗?虽然这似乎是控制器的工作。 没有。还有你的ViewController A
应该是delegate
的UITableView
作为子视图添加到View C
。根据 MVC,视图不应决定视图外观。
所以 ViewController 将同时拥有:view.delegate = self;
view.subview.delegate = self;
是的,应该是这样。最终,ViewController
应该负责管理所有视图和子视图。【参考方案2】:
委托是函数指针。使用它,可以轻松调用另一个类的函数。
创建委托,一般流程是,首先创建协议并在其中添加相关方法(在你要发起委托方法的类中)。这些方法可以由采用协议的类来实现。
您还需要创建称为委托属性的协议类型的通用属性。这将分配给符合协议的类的实例。
在您的情况下,B 类和 C 类定义了一些协议。这里,B 符合 C 类的协议,A 类符合 B 类的协议。
现在,B 类中有 c 类定义的对象。在 B 类中,这里我们需要将 C 类的委托分配给 B(self) 的实例。 (现在在 c 类中,委托属性包含 B 的实例,可以很容易地从 C 类调用在 B 类中实现的协议方法)。
同样的场景发生在 A 类和 B 类中,可以从 B 类调用 A 类的方法(在 B 类的协议中定义)。
下面是通过 A -> B -> C 实现委托链的概述。
A类
符合协议 B
它有B类的对象
将类 A(self) 的实例分配给类 B 的委托属性
在A类中,实现B类中定义的协议方法
B 类
用方法定义协议
定义充当委托实例的泛型类型的属性
符合协议 C
它有C类的对象
将类 B(self) 的实例分配给类 C 的委托属性
在B类中,实现C类中定义的协议方法
C 类
用方法定义协议
定义充当委托实例的泛型类型的属性
我希望这将帮助您了解委托在 ios 中的工作原理。
现在,您可以将 B 类和 C 类的协议符合 A 类(如果您不想对 B 类进行任何修改,只需调用上层的委托方法)。 em>
请参阅下面的概述
A类
符合协议 B
它有B类的对象
将类 A(self) 的实例分配给类 B 的委托属性
在A类中,实现B类中定义的协议方法
符合协议 C
通过B类的对象有C类的对象
将类 A(self) 的实例分配给类 C 的委托属性
在A类中,实现C类中定义的协议方法
B 类
用方法定义协议
定义充当委托实例的泛型类型的属性
C 类
用方法定义协议
定义充当委托实例的泛型类型的属性
【讨论】:
以上是关于UIView 和子视图代表的主要内容,如果未能解决你的问题,请参考以下文章