UIView 和子视图代表

Posted

技术标签:

【中文标题】UIView 和子视图代表【英文标题】:UIView & Subview Delegates 【发布时间】:2015-09-29 04:37:23 【问题描述】:

我只是想澄清一下我对委托模式的一些困惑,当这些视图有多个 UIView 和 Subview 时应该构建委托模式。为了清楚起见,让我们定义一些变量。

让我们将这些对象定义为:

视图控制器A UIView B 子视图C

现在,我了解了委托模式的工作原理(我认为),尽管我不确定如何在嵌套的 UIView 中实现此模式。我的一些问题是:

C 是否应该包含由其超级视图 (B) 实现的委托?

如果是,B 是否应该将此信息传递给它的委托 ViewController (A)?

这是一个场景,假设C 有一个 UITextView,这个文本视图的高度由从 API 服务获取的字符串确定。 B 无权访问 API,因为这项工作应该通过 ViewController (A) 完成。

C 应该包含一个指向:

    ViewController 的 (A) 委托实现? UIView 的 (B) 委托实现? 其他?

如果答案是 (2),那么 B 是否应该调用 ViewController (A) 并通过一系列事件传递此信息?

这是一个小的视觉效果:

A &lt;IBDelegate&gt; B <ICDelegate> C 呼叫Delegate.OnApiComplete(float height);

在这种情况下,“代表”是什么? (ICDelegateIBDelegate)。事件链是什么?

我只是想避免任何不必要的逻辑渗透到 UIView 中,而责任应该在控制器上。

我知道你可以通过 UIView 之间的共享对象来解决大部分场景,但是当涉及到网络服务时,这些值需要通过某种回调来检索。

我需要进一步澄清,让我知道。非常感谢任何帮助。

【问题讨论】:

我认为您可以单独创建 .h 文件并在该类中创建协议。无论您想在哪里实现这些协议方法,导入 .h 类并声明协议并实现该方法。你可以通过创建协议对象从任何地方调用。 【参考方案1】:

所以,你有这样的情况:

视图控制器 A --> 视图 B --> 视图 C

我会尽量确保我的ViewController AView BView C 做出这样的决定:

    创建协议ViewDelegate 并同时保留View BView C 委托其中的方法。 在View B 中创建属性@property (nonatomic, weak) id &lt;ViewDelegate&gt; 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 BView C 委托事件。

【讨论】:

是的,我明白这一点,但在我的情况下,视图 C 嵌套在视图 B 中。按照你将如何拥有一个包含 UITableView 的 UIView 的思路,在这种情况下,UIView 将实现委托正确吗?虽然这似乎是控制器的工作。 没有。还有你的ViewController A 应该是delegateUITableView 作为子视图添加到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 和子视图代表的主要内容,如果未能解决你的问题,请参考以下文章

UIView 和子视图 - 不透明度

自动布局和 UIScrollview 和子视图控制器问题

UIView详解

如何将 UIImageView 添加到 UIView(不是 UIViewController)?

空 UIView 上的自动布局约束无法按预期工作

在运行时和方向更改期间居中和 sizeToFit 子视图