为什么这个不同的“addSubView”代码会导致行为上的差异

时间:2011-04-21 23:12:06

标签: iphone ios uinavigationcontroller uitableview

为什么将以下代码从旧条目更改为新条目可修复以下问题。

代码:

  // OLD Entry - Did not work
  //[self.window addSubview:navigationController.view];

  // NEW Entry - Fixed it
  self.window.rootViewController = self.navigationController;

使用旧代码时出现问题:

  • 我正在使用UINavigationController并有一个“mainView”UITableViewController,然后是第二级视图,我将其推入堆栈,让我们称之为“detailedView”UITableViewController。

  • 正常导航从主要导航到细节工作正常

  • 但是在启动时自动启动到第二个视图(因为我保存状态)我到第二个视图OK,但在这种情况下,工具栏按钮不会出现在第二个视图的底部。当我返回主页面(通过UINavigationController标准安排),然后在UITableView中选择行,然后再次返回相同的视图,工具栏项目显示正常。

  • 无法跟踪此情况,但最终通过反复试验我注意到appDelegate(所有地方)的代码更改(见上文)似乎解决了这个问题。

有什么想法吗?

编辑:为了完整性,这里是完整的方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
    NSManagedObjectContext *context = [self managedObjectContext];
    if (!context) {
        abort();  // TODO: Do better job here than abort
    }
    rootViewController.managedObjectContext = context;
     self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

编辑2:哦,我确实有一个NIB文件并在界面构建器中设置了根视图控制器/窗口 - 所以我想知道我是否在这里混合使用NIB和编程方法可能会导致问题?

编辑3:还注意到当我添加“self.window.rootViewController = self.navigationController”行时,以下didFinishLaunchingWithOptions代码工作。这是没有这一行(这是coredatabooks示例所做的)我得到了问题。

RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
    rootViewController.managedObjectContext = self.managedObjectContext;
    self.window.rootViewController = self.navigationController;  // WORKS WHEN I ADD THIS LINE IN FOR SOME REASON???

    // Configure and show the window
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];

return YES;

1 个答案:

答案 0 :(得分:6)

两种方法之间的区别在于,一种方法触发了视图生命周期方法,另一种方法则没有。

即。设置window.rootViewController将导致旧视图控制器接收消息:viewDidDissaper viewWillDissapear等..而新视图控制器将接收viewWillApear,viewDidAppear等。

addSubview:不会这样做。

这有帮助吗?

修改

详细阅读您的帖子,看起来您正在以详细视图的viewDidAppear方法以编程方式添加按钮。

rootViewController的{​​{1}}属性自4.0起添加。文档没有明确提到它将触发视图生命周期方法,我通过像你自己的跟踪和错误发现了这一点。 (也许有人可以针对苹果文档提出问题)。

如果你需要向后兼容3.x,你可以这是一个自定义UIWindow子类。我的代码如下。使用UIWindow代替window.djRootViewController = yourViewController。它设计用于Interface builder。

window.rootViewController