2010-01-14 55 views
5

我想我错过了一些基本的东西,所以我想问一下社区的一些帮助。我正在构建基于基本iPhone实用程序应用程序的应用程序。我的MainView和FlipsideView共享一些元素,所以我为这些块创建了单独的ViewControllers和nib文件。为了做到这一点,我做了以下几件事: 1.创建一个名为searchDateViewController的视图控制器,它是searchDateView.xib的文件所有者。 2. searchDateView.xib基本上是一个UIView,内部带有UILabel,视图连接正确 3.内部都MainViewController.m和FlipsideViewController.m我添加一个子视图作为folllows:superview和parentviewcontroller在添加子视图后为零

- (void)loadView{ 
    [super loadView]; 
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil]; 
    [[searchDateViewController view] setFrame:[searchDateView frame]]; 
    [[self view] addSubview:[searchDateViewController view]]; 

... 
} 

一切都显示和工作得很好。基本上取决于每个主视图和反面视图中发生的操作,笔尖的UILabel已更改。但是,如果searchDateViewController是从MainView或FlipsideView加载的,我想做一些稍微不同的事情。但是,我似乎无法找出哪个ViewController添加searchDateViewController子视图。

在searchDateViewController我想:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"superview %@", self.view.superview); 
    NSLog(@"parentviewcontroller %@", self.parentViewController); 
} 

在这两种情况下,我得到零。

所以我的问题是 - 我可以找出哪个ViewController添加searchDateViewController一个子视图?如果是这样如何?或者如果我的逻辑完全搞砸了,我该怎么做呢?

谢谢!

回答

2

viewDidLoad当视图控制器加载其视图被调用。在你的情况,happends在这一行:

[[searchDateViewController view] setFrame:[searchDateView frame]]; 

在那一刻,你还没有叫addSubview:所以也难怪视图的上海华为零。

要解决您的问题,您应该在SearchDateViewController中定义一个属性以区分不同的情况。然后,该属性将由创建SearchDateViewController实例的父控制器相应地设置。

通常,我不认为使用UIViewController子类作为一个视图的控制器是一个好主意,该视图用作一个或多个全屏视图的子视图,而不是用作全屏视图本身。大部分UIViewController的逻辑假定它用于管理全屏视图。例如,在你的设计中,我认为SearchDateViewController可能会在设备方向改变时修改视图的框架。由于您不需要全屏子视图的全部功能,因此我建议您直接从NSObject子类化SearchDateViewController。

+0

好的,谢谢你指出我有关子视图和UIViewController子类的正确方向。如果我让SearchDateViewController成为NSObject的一个子类,那么这将如何影响我添加子视图和使用nib启动的方式?我还没有找到任何子视图的例子作为nsobjects而不是视图控制器,但我想在这种情况下开始采用任何标准的做法。如果您有任何更多提示,请告知我,谢谢! 此外 - 你们都建议使用父控制器,这是有道理的,但超视角扮演什么角色?这在这里会更合适吗? – deadroxy 2010-01-14 15:49:33

+0

使SearchDateViewController成为NSObject的一个子类并没有消除你的问题,它只是避免了未来的问题,因为UIViewControllers并不真正用于不占用整个窗口恕我直言的视图。 要解决您的问题,您的视图自定义代码不应该依赖于self.parentViewController或view.superview。相反,在SearchDateViewController中定义一个属性(可以是BOOL或枚举),然后查询它们以决定如何定制视图。创建SearchDateViewController的对象应该设置属性。 – 2010-01-14 19:23:02

+0

我这样做就像你说的在SearchDateViewController类中创建一个属性,它工作正常。然而,我仍然困惑于如何从UIViewController的子类转换为UIView/NSObject。特别是谁成为​​SearchDateView的文件所有者?我试过每一种方式,我所做的一切都会导致错误。 – deadroxy 2010-01-14 20:42:06

-2

ViewController与视图完全分离。

在大多数情况下,当您向父视图添加子视图时,不要将其控制器添加到父视图的控制器。此规则的例外是导航控制器,它添加了控制器而不是视图来维护视图控制器的层次结构。

您的SearchDate viewController无法找到父控制器,因为您从未分配过一个控制器,系统也不会自动执行此操作。当您从另一个控制器唤起视图时,您可以分配一个父控制器。

searchDateViewController.parentController=self; 
+0

我的理解是,parentViewController是准备好的,所以我不能设置它(实际上我得到一个错误,当我尝试)。 – deadroxy 2010-01-14 15:53:38

+0

快速跟进 - 我想你可能意味着Ole没有在SearchDateViewController中创建一个新的属性来保存这些信息。这很有效,但我仍然对Ole关于这个策略的评论(使用UIViewControllers作为子视图)持怀疑态度,通常违背良好的设计原则...... – deadroxy 2010-01-14 15:57:28

+0

你的权利是只读的。我只是假设它是读/写的,因为导航控制器设置了属性。我想知道导航控制器如何设置属性? Ole是正确的,在同一个可见屏幕上有多个控制器是不好的做法。这个API不太容易支持。 – TechZen 2010-01-14 22:33:06

相关问题