5

我想我缺少一些基本的东西,所以我想向社区寻求帮助。我正在构建一个基于基本 iPhone 实用程序应用程序的应用程序。我的 MainView 和 FlipsideView 共享一些元素,因此我为这些部分创建了单独的 ViewController 和 nib 文件。为了做到这一点,我做了以下工作: 1. 创建了一个名为 searchDateViewController 的视图控制器,它是 searchDateView.xib 文件的所有者 2. searchDateView.xib 基本上是一个 UIView,里面有一个 UILabel,视图连接正确 3. 里面MainViewController.m 和 FlipsideViewController.m 我都添加了一个子视图,如下所示:

- (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 aa 子视图吗?如果有怎么办?或者如果我这里的逻辑完全搞砸了,我应该怎么做?

谢谢!

4

2 回答 2

2

viewDidLoad当视图控制器加载其视图时调用。在您的情况下,这发生在这一行:

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

在那一刻,你还没有调用addSubview:,所以难怪视图的超级视图为零。

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

一般来说,我认为将 UIViewController 子类用作视图的控制器并不是一个好主意,该视图用作一个或多个全屏视图的子视图,而不是用作全屏视图本身。UIViewController 的大部分逻辑都假设它用于管理全屏视图。例如,在您的设计中,我认为 SearchDateViewController 可能会在设备方向更改等时修改视图的框架。由于您不需要非全屏子视图的所有这些功能,我建议您直接从 NSObject 子类化您的 SearchDateViewController .

于 2010-01-14T14:23:09.030 回答
-2

ViewController 和视图是完全分开的。

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

您的SearchDateviewController 找不到父控制器,因为您从未分配过父控制器,并且系统不会自动执行此操作。当您从另一个控制器调用视图时,您可以只分配一个父控制器。

searchDateViewController.parentController=self;
于 2010-01-14T14:19:48.103 回答