我认为我缺少一些基本的东西,所以我想向社区寻求帮助。我正在构建一个基于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一个子视图?如果是这样的话?或者,如果我的逻辑完全搞砸了,我该怎么做呢?
谢谢!
答案 0 :(得分:2)
viewDidLoad
。在你的情况下,这一行发生在这一行:
[[searchDateViewController view] setFrame:[searchDateView frame]];
那一刻,你还没有打电话给addSubview:
所以难怪视图的超级视图是零。
要解决您的问题,您应该在SearchDateViewController中定义一个属性,以区分不同的情况。然后,由创建SearchDateViewController实例的父控制器相应地设置此属性。
通常,我不认为使用UIViewController子类作为视图的控制器是个好主意,该视图用作一个或多个全屏视图的子视图,而不是用作全屏视图本身。 UIViewController的大部分逻辑都假设它用于管理全屏视图。例如,根据您的设计,我认为当设备方向改变等时,SearchDateViewController可能会修改视图的框架。由于您不需要非全屏子视图的所有这些功能,我建议您直接从NSObject继承您的SearchDateViewController
答案 1 :(得分:-2)
ViewController和视图是完全独立的。
在大多数情况下,当您将子视图添加到父视图时,不会将其控制器添加到父视图中。此规则的例外是导航控制器,它添加控制器而不是视图以维护视图控制器的层次结构。
您的SearchDate
viewController无法找到父控制器,因为您从未分配过父控制器,系统不会自动执行此操作。当您从另一个控制器唤起视图时,您可以只分配一个父控制器。
searchDateViewController.parentController=self;