iPhone - 行为类似于 UIViewController 的 UIView

Posted

技术标签:

【中文标题】iPhone - 行为类似于 UIViewController 的 UIView【英文标题】:iPhone - a UIView that behaves like a UIViewController 【发布时间】:2011-10-25 14:54:10 【问题描述】:

我需要创建一个将呈现 UIVIew 的类,并有一些代码在它准备好显示之前对其进行初始化。我需要知道视图何时准备就绪,我的意思是,我需要 viewDidLoad 或 viewWillAppear 之类的东西,但由于它是 UIVIew,它缺少这些协议。

我不能将它实现为 UIViewController,因为我不想将它呈现为模态。它确实是一个矩形视图,需要在屏幕一侧显示。

如何声明这个类?如果该类是基于 UIView 的,我没有我提到的方法。

谢谢

【问题讨论】:

【参考方案1】:

有什么理由不在UIViewinitWithFrame 方法中做这种事情吗?此外,您可以在 layoutSubviews 上做其他事情。视图控制器具有viewDidLoad,因为视图是延迟加载的(从笔尖或其他方式 - 它也有loadView)。它有viewWillAppearviewWillDisappear,因为它管理 视图(顺便说一句,即使视图控制器也由另一个视图控制器管理 - 当您在 UINavigationController 或 UITabBarController 中有控制器时调用这些方法或管理 UIViewControllers 的此类。-视图本身并没有真正管理任何东西。它所知道的只是如何绘制自己。为此,您有 layoutSubViewsdrawRect 等。

在视图负载时做一些繁重的事情肯定会降低 UI 性能。您可能需要实现另一种设计模式,将数据值异步分配给自定义视图的实例 - 完成后,您调用 layoutSubviewssetNeedsDisplay 来更新视图。

【讨论】:

【参考方案2】:

您描述的场景不是不实现 UIViewController 的理由。假设您有一个容器视图 A 和一个子视图 B。两者都有自己的 UIViewController AC 和 BC。现在在 AC 上添加由 BC 管理的视图 B:

[self.view addSubview:BC.view];

【讨论】:

不,每个视图不需要有一个视图控制器。视图控制器管理以相关方式显示信息的视图。它总是由子视图组成。子视图不需要自己的控制器。视图只知道如何绘制自己 - 这是它的唯一责任。 在问题中的原因是“因为我不想以模态形式呈现它”。所以我建议仔细想想那个“原因”。感谢您投票反对... 好吧,对不起。我的反对意见是断言每个视图都需要有一个视图控制器——事实并非如此。【参考方案3】:

您可能想使用UIViewController

您不必只是以模态方式呈现它们。您可以使用yourViewController.view 获取视图控制器的视图,并将其添加为您想要的任何视图的子视图。

如果您的目标是 ios 5,则有一些新方法(例如 addChildViewController:)旨在让您更轻松地执行此类操作。不过,您也可以在 iOS 4 上执行此操作,而且它仍然可以工作。

【讨论】:

【参考方案4】:

在你的 UIView 中实现一个 drawRect,加上一个初始化标志。就在要显示视图之前,将调用 drawRect。如果尚未设置初始化标志,请进行初始化并设置标志。如果您的初始化可以快速完成(不需要长时间的同步调用),这只会看起来不错。

【讨论】:

【参考方案5】:

我需要创建一个将呈现 UIVIew 的类,并有一些代码在它准备好显示之前对其进行初始化。我需要知道视图何时准备就绪,我的意思是,我需要 viewDidLoad 或 viewWillAppear 之类的东西,但由于它是 UIVIew,它缺少这些协议。

您可能需要重新考虑如何使用您的视图。听起来您正试图将太多类似控制器的逻辑放入您的视图中。这就是为什么你希望你的视图表现得像一个控制器。

更具体地说:您到底想完成什么?如果您在显示视图之前等待数据加载,那实际上可能需要放入调用视图的控制器中。

为了说明我的观点,假设您将一些文本放入您从磁盘读取的 UILabel 中。从磁盘读取与视图无关。视图只关心它显示的文本,而不关心它如何接收文本。从磁盘读取后,您可以使用您读取的文本创建 UILabel。这让 UILabel 更加灵活。

该示例可能与您正在做的事情完全无关,但我将其用作视图和控制器之间差异的示例。任何与视图的显示和绘制无关的东西都不应该属于那里。

【讨论】:

以上是关于iPhone - 行为类似于 UIViewController 的 UIView的主要内容,如果未能解决你的问题,请参考以下文章

类似于原生联系人应用程序的粘性搜索栏和部分标题行为

Android中是不是有类似iPhone的钥匙串?

iOS - iPhone 应作为 REST 服务器

如何创建类似于 iphone 铃声设置的 tableview?

想要类似于 iPhone 日历列表视图的东西吗?

实现类似于 iPhone 联系人应用程序的“添加照片”按钮