未使用initWithNibName从NIB加载的子视图

时间:2009-06-18 06:28:18

标签: iphone

我的RootViewController(这是一个UITableViewController)中有以下代码。单击导航栏中的按钮然后(在模拟器中)显示下一个视图时执行此代码。但是,不会显示由TripDetailsController管理的视图中绘制的子视图(UITextLabels,UIButtons)。此外,在屏幕顶部的导航栏中,未显示原始视图的“后退”按钮,但是当我单击导航栏的左侧时,它会转换回原始视图。

  • TripDetailsController.view链接到Interface Builder中的TripDetailsView(UIView)
  • tdController确实有一个值,所以它看起来好像已经加载了
  • TripDetailsController位于单独的NIB文件中
  • 使用iPhone SDK 2.2.1(所以还没有3.0)

代码:

 TripDetailsController *tdController = [[TripDetailsController alloc]
                  initWithNibName:@"TripDetailsController" bundle:nil];
 [self.navigationController pushViewController:tdController animated:YES];
 [tdController release];

在TripDetailsController类中,我添加了viewDidLoad方法,如下所示:

代码:

- (void)viewDidLoad {
  [super viewDidLoad];
  self.navigationItem.title = @"Reis Details";    

  NSLog(@"Subviews: %@", self.view.subviews);
  UILabel *l = [self.view.subviews objectAtIndex:0];
  NSLog(@"Subview 0 bounds: %@", l.bounds);
}

下面的日志消息确实显示了子视图,但也没有设置边界:

代码:

6/18/09 Jun 18, 2009   10:06:00 PM ReisAdvies[11226] Subviews: (
    <UILabel: 0x56f250>,
    <UILabel: 0x56f5a0>,
    <UILabel: 0x56f6b0>,
    <UILabel: 0x56f780>
) 
6/18/09 Jun 18, 2009   10:06:00 PM ReisAdvies[11226] Subview 0 bounds: (null) 

在Interface Builder中,“标签大小”选项卡显示X / Y / W / H的值。感觉就像我必须触发它来做一些布局活动,但是在viewDidLoad()中调用layoutSubviews并没有帮助。 任何想法可能是什么问题?

5 个答案:

答案 0 :(得分:2)

在Interface Builder中找到解决方案:

  1. 在NIB文件中,我没有包含UIWindow,所以我在NIB文件中添加了一个UIWindow,并将TripDetailsController.view出口连接到新添加的UIWindow。
  2. 文件的所有者视图属性连接到TripDetailsView(UIView)
  3. File的Owner类设置为UIViewController
  4. 现在它按预期工作。

    不是100%确定这是否是'方式',但至少它对我来说似乎没问题。

答案 1 :(得分:1)

我在你的代码中注意到的第一件事就是你调用了一个函数:

tdController.loadView;

据我所知,这不能在objective-c中完成。你必须这样称呼它:

[tdController loadView];

此外,您在哪里进行所有初始化?在“loadView”中,在“viewDidLoad”中?

尝试使用类似的方式将控制器添加到屏幕上(推送Views而不是ViewControllers):

[self.view insertSubview:tdController.view atIndex:0];

上面的代码假设它在另一个UIViewController子类中运行,它将控制器的视图作为子视图加载到它自己的视图中。

答案 2 :(得分:1)

  

另外,在顶部的导航栏中   屏幕,'后退'按钮   原始视图未显示,但是   当我点击左侧的时候   导航栏它确实转换回来   原来的观点。

您是否为navigationItem设置了标题?

例如,在TripDetailsController viewDidLoad

self.navigationitem.title = @"trip detail";

答案 3 :(得分:0)

导航到子视图的方式对我来说一般都很好。我唯一要提的是你的[TripDetailController -loadView]消息。我从来没有这样做过。 Normall我只是将一些状态信息传递给依赖控制器,然后依赖于标准机制(即viewDidLoad)将其添加到UINavigationController来初始化控制器的逻辑。

您是否收到-viewDidLoad消息?你的控制器在那一刻启动并运行了吗?

在您的项目中某处可能是一个微妙的布线问题/类型。

答案 4 :(得分:0)

这对我有用...

从XIB中删除了Window和ViewControl,并将File的所有者设为ViewCOntroller类,然后将文件所有者视图连接到我的视图。

是否使用initWithNibName加载...

iPhone Dev的新手,以及我可以通过多少方式将自己挂在IB中。