2011-04-21 59 views
8

为什么将以下代码从Old更改为New条目解决了以下问题。为什么这个不同的“addSubView”代码导致行为上的差异

代码:

  • 我使用一个UINavigationController,有一个“MAINVIEW”的UITableViewController,然后一个2级视图我推到了:当我使用旧代码

    // OLD Entry - Did not work 
        //[self.window addSubview:navigationController.view]; 
    
        // NEW Entry - Fixed it 
        self.window.rootViewController = self.navigationController; 
    

    问题我们把它称为“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代码工作。这没有这条线(这是Coredat书的例子),我得到的问题。

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; 
+0

如何在重新启动时导航到第二个视图控制器? – nielsbot 2011-05-10 22:42:56

回答

6

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

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

addSubview:并没有这样做。

这有帮助吗?

编辑:

阅读详细您的文章看起来你是在细节示图的viewDidAppear方法编程添加按钮。

UIWindowrootViewController财产增加至4.0。文档没有明确提到它会触发视图生命周期方法,我通过跟踪和错误发现了这一点。 (也许有人可以针对苹果文档提出问题)。

如果您需要向后兼容3.x,则可以使用此自定义UIWindow子类。我的代码如下。使用window.djRootViewController = yourViewController而不是window.rootViewController。它专为在Interface Builder中使用而设计。

#import <UIKit/UIKit.h> 

@interface DJWindow : UIWindow { 

    UINavigationController* m_navigationController; 
} 

@property (nonatomic, retain) UIViewController* djRootViewController; 

@end 




#import "DJWindow.h" 

@interface DJWindow() 

- (void) customInit; 

@end 


@implementation DJWindow 


- (id) initWithCoder:(NSCoder *)coder { 
    self = [super initWithCoder:coder]; 
    if (self) { 
     [self customInit]; 
    } 
    return self; 
} 


- (void) customInit { 
    m_navigationController = [[UINavigationController alloc] init]; 

    m_navigationController.navigationBarHidden = YES; 

    [self addSubview:m_navigationController.view]; 
} 

- (void) setRootViewController:(UIViewController *)rootViewController { 
    NSLog(@"ERROR, do not set the rootViewController property, use djRootViewController instead"); 
} 

- (void) setDjRootViewController:(UIViewController *)djRootViewController { 

    if (djRootViewController == nil) { 
     [m_navigationController setViewControllers:nil]; 
    } else { 
     NSArray* vcArray = [NSArray arrayWithObject:djRootViewController]; 
     [m_navigationController setViewControllers:vcArray]; 
    } 
} 

- (UIViewController*) djRootViewController { 

    return m_navigationController.visibleViewController; 
} 

- (void)dealloc 
{ 
    [m_navigationController release]; 
    [super dealloc]; 
} 


@end 
+0

嗨罗伯特 - 对我来说不完全有意义,我不得不承认。在哪里可以找到你在这里提到的信息? (例如,在其中一个苹果指南中?)。实际上应该使用哪种正确的方法?我注意到它在Apple UITableView指南中指的是使用“addSubView”方法...即在http://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewAndDataModel/TableViewAndDataModel.html#//apple_ref/doc/uid/TP40007451-CH5-SW16。我也在最初的文章中更新了我的完整方法。 – Greg 2011-04-23 00:18:54

+0

哦,我有一个NIB文件,并在界面生成器中有根视图控制器/窗口设置 - 所以我想知道我是否将NIB和程序化方法混合在一起,这可能会导致问题? – Greg 2011-04-23 00:25:43

相关问题