superview和parentviewcontroller在添加子视图后为零

时间:2010-01-14 13:59:09

标签: iphone cocoa-touch parentviewcontroller superview

我认为我缺少一些基本的东西,所以我想向社区寻求帮助。我正在构建一个基于iPhone实用程序基本应用程序的应用程序。我的MainView和FlipsideView共享一些元素,所以我为这些片段创建了单独的ViewControllers和nib文件。为了做到这一点,我做了以下事情: 1.创建了一个名为searchDateViewController的viewcontroller,它是searchDateView.xib的文件所有者 2. searchDateView.xib基本上是一个内部有UILabel的UIView,视图连接正确 3.在MainViewController.m和FlipsideViewController.m中,我添加一个子视图作为folllows:

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

...
}

一切都显示并且工作得很好。基本上取决于每个主视图和翻转视图中发生的动作,笔尖的UILabel被更改。但是,如果从MainView或FlipsideView加载searchDateViewController,我想做一些稍微不同的事情。但是,我似乎无法弄清楚哪个ViewController正在添加searchDateViewController子视图。

在searchDateViewController中我尝试过:

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

在这两种情况下,我都没有。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

视图控制器加载其视图时,将调用

viewDidLoad。在你的情况下,这一行发生在这一行:

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

那一刻,你还没有打电话给addSubview:所以难怪视图的超级视图是零。

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

通常,我不认为使用UIViewController子类作为视图的控制器是个好主意,该视图用作一个或多个全屏视图的子视图,而不是用作全屏视图本身。 UIViewController的大部分逻辑都假设它用于管理全屏视图。例如,根据您的设计,我认为当设备方向改变等时,SearchDateViewController可能会修改视图的框架。由于您不需要非全屏子视图的所有这些功能,我建议您直接从NSObject继承您的SearchDateViewController

答案 1 :(得分:-2)

ViewController和视图是完全独立的。

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

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

searchDateViewController.parentController=self;