我很生气地在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];
}
但是......我该怎么办?
答案 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
我的头发少了......: - )