iPhone-导航控制器不工作
在iPhone上使用导航控制器我快疯了。 我有一个应用程序,里面有一个主xib(带窗口的那个),我放了一个NavigationController,里面有一个viewController。一切都已连接,并且使用正确的继承类名定义了ViewController 在didFinishLaunchingWithOptions中,我有:iPhone-导航控制器不工作,iphone,uinavigationcontroller,overlay,modalviewcontroller,Iphone,Uinavigationcontroller,Overlay,Modalviewcontroller,在iPhone上使用导航控制器我快疯了。 我有一个应用程序,里面有一个主xib(带窗口的那个),我放了一个NavigationController,里面有一个viewController。一切都已连接,并且使用正确的继承类名定义了ViewController 在didFinishLaunchingWithOptions中,我有: [self.window addSubview:navigationController.view]; [self.window makeKeyAndVisible];
[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
主xib中的所有项目似乎都已连接。。。并由物业保留。AppDelegate及其窗口和导航控制器。。。具有相同navigationController的窗口rootviewcontroller。。。和应用程序代理的文件所有者
一切正常,但“首选项”窗口从未出现
你知道为什么吗
如果需要,我必须说,第一个视图控制器使相机界面出现,并在其上覆盖一层。该按钮位于该覆盖层上。imagePicker在ViewDidDisplay中显示如下:
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[self presentModalViewController:picker animated:YES];
[picker release];
编辑:
在ViewDidDisplay中,self.navigationController在方法的开始和结束处都正常。
在definePreferences中,self.navigationController为零。在这两个电话中没有一个叫甜菜。 没什么 编辑: 问题可能来自我初始化按钮所在的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];
}
但是。。。我该怎么做?首先,不要调用iAction
设置首选项:
。这违反了KVC,最终会导致各种奇怪的行为setX:
是名为x
的属性的setter的保留名称
您不应使用此方法创建导航控制器(即navController
)。您应该使用在NIB中创建的一个(self.navigationController
)。检查是否为零。如果是,那么您要么没有在NIB中设置导航控制器,要么没有将其连接到此视图控制器
- (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];
}
您还应该验证
nextWindow
是否为非零。首先,切勿调用iActionsetPreferences:
。这违反了KVC,最终会导致各种奇怪的行为setX:
是名为x
的属性的setter的保留名称
您不应使用此方法创建导航控制器(即navController
)。您应该使用在NIB中创建的一个(self.navigationController
)。检查是否为零。如果是,那么您要么没有在NIB中设置导航控制器,要么没有将其连接到此视图控制器
- (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];
}
您还应该验证
nextWindow
是否为非零。我最终解决了这个问题。
看
我有些头发没了…:-) 我终于解决了这个问题。 看
我有些头发没了…:-) @Rob Napier:好的,我重新命名了方法。我只调用[self.navigationController presentModalViewController:nextWindow动画:YES];下一次分配之后。nextWindow不是零。还是没什么。。。self.navigationController为零,但我可以检查xib中的所有内容,所有项目似乎都已连接。。。并由物业保留。AppDelegate及其窗口和导航控制器。。。具有相同navigationController的窗口rootviewcontroller。。。和应用程序代理的文件所有者。。。知道出了什么问题吗?“self.navigationController为零”← 那是你的问题。对nil对象调用
presentModalViewController:animated:
不会有任何作用。@Anomie:是的,我知道,但怎么了?事情似乎联系得很好。电话似乎是好的。那又怎样@Oliver你能为所有目标清理你的项目并重新构建它吗?同时从模拟器中删除你的应用程序…你关于ViewDidIspect的评论让我想知道你是否有多个view controller副本。NSLog(@“%@”,self)并确保始终查看同一对象。您还可以重写setNavigationController:
,并查看是谁在调用它。@Rob Napier:好的,我重命名了该方法。我只调用[self.navigationController presentModalViewController:nextWindow动画:YES];下一次分配之后。nextWindow不是零。还是没什么。。。self.navigationController为零,但我可以检查xib中的所有内容,所有项目似乎都已连接。。。并由物业保留。AppDelegate及其窗口和导航控制器。。。具有相同navigationController的窗口rootviewcontroller。。。和应用程序代理的文件所有者。。。知道出了什么问题吗?“self.navigationController为零”← 那是你的问题。对nil对象调用presentModalViewController:animated:
不会有任何作用。@Anomie:是的,我知道,但怎么了?事情似乎联系得很好。电话似乎是好的。那又怎样@Oliver你能为所有目标清理你的项目并重新构建它吗?同时从模拟器中删除你的应用程序…你关于ViewDidIspect的评论让我想知道你是否有多个view controller副本。NSLog(@“%@”,self)并确保始终查看同一对象。您还可以覆盖setNavigationController:
并查看是谁在调用它。您是否检查了当您触摸按钮时,是否实际调用了setPreferences:
方法,例如,使用日志语句或调试器断点?请注意,您的窗口和navigationController都不会被保留,因为您在IVAR而不是属性上设置了IBOutlet。因此,ivar最终是直接设置的,而不需要通过setter方法来保留它们。@Anomie是正确的,IBOutlet应该在属性上,但我怀疑这是问题所在,或者你宁愿崩溃也不愿得到零。@Rob Napier:uhhhh,你确定吗?我不想谈论一些我不确定的事情,但我已经用这种方式完成了一个大项目,IBOutlet设置在ivars上,而且永远不会