iPhone - 导航控制器无法正常工作

时间:2011-03-15 01:01:05

标签: iphone uinavigationcontroller overlay modalviewcontroller

我很生气地在iPhone上使用导航控制器。 我有一个应用程序,带有一个主xib(带窗口的那个)里面我放了一个NavigationController,里面有一个viewController。一切都已连接,ViewController使用正确的继承类名定义。

在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 ...具有相同navigationController的Window rootviewcontroller ...以及带有app delegate的文件所有者...

一切运行正常,但首选项窗口永远不会出现......

你能明白为什么吗?

如果需要,我必须说第一个视图控制器使相机界面出现并在其上面叠加。按钮位于此叠加层上。 imagePicker在viewDidAppear中显示如下:

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

编辑: 在viewDidAppear中,self.navigationController在方法的开头和结尾都可以。 在definePreferences中,self.navigationController是nil。在这两个电话之间没有任何东西被称为。 没什么

编辑: 问题可能来自我初始化按钮所在的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];
}

但是......我该怎么办?

2 个答案:

答案 0 :(得分:1)

首先,永远不要打电话给IBAction setPreferences:。这违反了KVC,最终可能导致各种奇怪的行为。 setX:是名为x的属性的setter的保留名称。

您不应该在此方法中创建导航控制器(即navController)。您应该使用在NIB中创建的那个(self.navigationController)。检查是否为零。如果是,那么你要么没有在NIB中设置导航控制器,要么没有将它连接到这个视图控制器。

您还应验证nextWindow是否为非零。

答案 1 :(得分:0)

我最终解决了这个问题。 见https://stackoverflow.com/questions/5317968/iphone-camera-overlay-going-down-after-a-modal-view-transition

我的头发少了......: - )