1

我在iPhone上使用導航控制器發瘋。 我有一個應用程序,與主xib(與窗口之一)裏面至極放置一個NavigationController,裏面至極我有一個viewController。所有東西都連接在一起,ViewController使用正確的繼承類名來定義。iPhone - 導航控制器不工作

在didFinishLaunchingWithOptions,我有:

[self.window addSubview:navigationController.view]; 
[self.window makeKeyAndVisible]; 

在.H我有:

@interface MainAppDelegate : NSObject <UIApplicationDelegate> { 
    IBOutlet UIWindow *window; 
    IBOutlet UINavigationController* navigationController; 
} 

@property (nonatomic, retain) UIWindow *window; 
@property (nonatomic, retain) UINavigationController* navigationController; 

@end 

然後在首先的ViewController我具有連接到該方法中的按鈕:

- (IBAction) definePreferences:(id)sender { 
    PreferencesController *nextWindow = [[[PreferencesController alloc] initWithNibName:@"Preferences" bundle:nil] autorelease];   
    UINavigationController* navController = [[[UINavigationController alloc] initWithRootViewController:nextWindow] autorelease]; 
    [self.navigationController presentModalViewController:navController animated:YES]; 
} 

主xib中的所有項目似乎都被連接...並被屬性保留。在AppDelegate中有它的窗口和navigationController ...窗口RootViewController的具有相同navigationController ......與應用程序的委託文件的所有者...

一切都正常運行,但從來沒有出現在首選項窗口...

你能看到爲什麼嗎?

如果需要,我必須說,這第一個視圖控制器使相機接口出現並覆蓋它。該按鈕位於此覆蓋層上。所述imagePicker是示出像這樣在viewDidAppear:

UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
[self presentModalViewController:picker animated:YES]; 
    [picker release]; 

編輯: 在viewDidAppear,self.navigationController是在開始和方法的端部確定。 在definePreferences中,self.navigationController爲零。這兩個電話之間什麼都不叫。 Nothing

編輯: 問題可能來自我初始化按鈕所在的viewController的方式。 以下是由導航控制器調用的firstView調用的方法。

- (void) viewDidAppear:(BOOL)animated { 

    UIImagePickerController* picker = [[UIImagePickerController alloc] init]; 

    // Set the image picker source: 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 

    picker.showsCameraControls = NO; 
    picker.navigationBarHidden = YES; 
    picker.wantsFullScreenLayout = YES; 

    // Insert the overlay 
    OverlayViewController* overlayController = [[OverlayViewController alloc] initWithNibName:@"Overlay" bundle:nil]; 
    picker.cameraOverlayView = overlayController.view; 

    // Show the picker: 
    [self presentModalViewController:picker animated:NO]; 
    [picker release]; 

    [super viewDidAppear:YES]; 
} 

但是......我該怎麼辦?

+0

你檢查你的'setPreferences:'方法實際上是被當你觸摸按鈕時調用,例如用日誌語句或調試器斷點? – Anomie 2011-03-15 01:31:51

+0

@Anomie:當然 – Oliver 2011-03-15 01:35:10

+1

請注意,您的窗口和navigationController都不會被保留,因爲您已經在ivars上設置了IBOutlet而不是屬性。因此,伊娃最終直接被設置,而不用通過可以「保留」它們的setter方法。 – Anomie 2011-03-15 02:22:31

回答

1

首先,永遠不要調用IBAction setPreferences:。這違反了KVC,並最終會導致各種奇怪的行爲。 setX:是名爲x的屬性的設置者的保留名稱。

您不應該使用此方法創建導航控制器(即navController)。您應該使用您在NIB中創建的那個(self.navigationController)。檢查是否爲零。如果是,那麼你要麼沒有在NIB中設置導航控制器,要麼你沒有將它連接到這個視圖控制器。您應該確認nextWindow不是零。

+0

@Rob Napier:好的,我重命名了這個方法。我只調用[self.navigationController presentModalViewController:nextWindow animated:YES];在nextWindow分配之後。 nextWindow不是零。仍然沒有... self.navigationController是零,但我可以檢查xib中的所有內容,所有項目似乎都已連接...並由屬性保留。帶有窗口和導航控制器的AppDelegate ...具有相同導航控制器的窗口rootviewcontroller ...以及具有應用程序委託的文件所有者...對發生什麼問題有任何想法? – Oliver 2011-03-15 01:15:14

+0

「self.navigationController爲零」←這是你的問題。在一個nil對象上調用'presentModalViewController:animated:'不會做任何事情。 – Anomie 2011-03-15 01:42:37

+0

@Anomie:是的,我知道,但是怎麼了?事情似乎很好連接。通話似乎是好的。所以呢... ? – Oliver 2011-03-15 01:57:47