2011-04-21 58 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

相關問題