iPhone - 一个行为类似于UIViewController的UIView

时间:2011-10-25 14:54:10

标签: iphone ios ipad uiviewcontroller

我需要创建一个将呈现UIVIew的类,并且在准备好显示之前有一些代码来初始化它。我需要知道视图何时准备就绪,我的意思是,我需要像viewDidLoad或viewWillAppear这样的东西,但因为它是UIVIew它缺乏这些协议。

我无法将其实现为UIViewController,因为我不想将其呈现为模态。它实际上是一个需要在屏幕上显示的矩形视图。

如何申报此课程?如果该类是基于UIView的,我没有我提到的方法。

感谢

5 个答案:

答案 0 :(得分:3)

有什么理由不在initWithFrame的{​​{1}}方法中执行此类操作?此外,您可以在UIView上执行其他操作。视图控制器具有layoutSubviews,因为视图是延迟加载的(来自笔尖或其他 - 它还具有viewDidLoad)。它有loadViewviewWillAppear,因为它管理视图(顺便说一下,即使视图控制器由另一个视图控制器管理 - 当你有控制器时调用这些方法UINavigationController或UITabBarController或类似于管理UIViewControllers的类。 - 视图本身并不是真正管理任何东西。它只知道如何绘制自己。为此,你有viewWillDisappearlayoutSubViews等。

在视图加载时执行一些繁重的操作肯定会破坏UI性能。您可能需要实现另一种设计模式,将异步数据值异步分配给自定义视图的实例 - 完成后,您可以调用drawRectlayoutSubviews来更新视图。

答案 1 :(得分:2)

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

[self.view addSubview:BC.view];

答案 2 :(得分:1)

您可能希望使用UIViewController

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

如果您的目标是iOS 5,那么有一些新方法(例如addChildViewController:)旨在让这样的事情变得更容易。你也可以在iOS 4上完成它,它仍然有用。

答案 3 :(得分:1)

在youR UIView中实现drawRect,以及初始化标志。在要显示视图之前,将调用drawRect。如果尚未设置初始化标志,请进行初始化并设置标志。如果您的初始化可以快速完成(没有长时间的同步调用),这只会看起来很好。

答案 4 :(得分:1)

  

我需要创建一个将呈现UIVIew的类,并且在准备好显示之前有一些代码来初始化它。我需要知道视图何时准备就绪,我的意思是,我需要像viewDidLoad或viewWillAppear这样的东西,但因为它是UIVIew它缺乏这些协议。

您可能想重新考虑视图的使用方式。听起来你正试图在视图中加入类似控制器的逻辑。这就是为什么你希望你的视图像控制器一样。

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

为了说明我的观点,想象一下你在从磁盘读取的UILabel中放入了一些文本。从磁盘读取与视图无关。视图仅关注它显示的文本,而不关心它是如何接收文本的。从磁盘读取后,您可以使用您阅读的文本创建UILabel。这使得UILabel更加灵活。

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