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】:有什么理由不在UIView
的initWithFrame
方法中做这种事情吗?此外,您可以在 layoutSubviews
上做其他事情。视图控制器具有viewDidLoad
,因为视图是延迟加载的(从笔尖或其他方式 - 它也有loadView
)。它有viewWillAppear
和viewWillDisappear
,因为它管理 视图(顺便说一句,即使视图控制器也由另一个视图控制器管理 - 当您在 UINavigationController 或 UITabBarController 中有控制器时调用这些方法或管理 UIViewControllers 的此类。-视图本身并没有真正管理任何东西。它所知道的只是如何绘制自己。为此,您有 layoutSubViews
、drawRect
等。
在视图负载时做一些繁重的事情肯定会降低 UI 性能。您可能需要实现另一种设计模式,将数据值异步分配给自定义视图的实例 - 完成后,您调用 layoutSubviews
或 setNeedsDisplay
来更新视图。
【讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章