我想像'ABPeoplePickerNavigationController'一样启动模态视图控制器,而不必创建包含视图控制器的导航控制器。
执行类似操作会产生一个空白屏幕,没有导航栏的标题,并且没有为视图加载任何关联的nib文件,即使我在调用'init'时调用initWithNibName。
我的控制器如下:
@interface MyViewController : UINavigationController
@implementation MyViewController
- (id)init {
NSLog(@"MyViewController init invoked");
if (self = [super initWithNibName:@"DetailView" bundle:nil]) {
self.title = @"All Things";
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"All Things - 2";
}
@end
使用AB控制器时,您只需:
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate = self;
[self presentModalViewController:picker animated:YES];
[picker release];
ABPeoplePickerNavigationController声明为:
@interface ABPeoplePickerNavigationController : UINavigationController
另一种创建模态视图的方法,如Apple的“View Controller Programming Guide for iPhone OS':
// Create a regular view controller.
MyViewController *modalViewController = [[[MyViewController alloc] initWithNibName:nil bundle:nil] autorelease];
// Create a navigation controller containing the view controller.
UINavigationController *secondNavigationController = [[UINavigationController alloc] initWithRootViewController:modalViewController];
// Present the navigation controller as a modal view controller on top of an existing navigation controller
[self presentModalViewController:secondNavigationController animated:YES];
我可以这样创建它(只要我改变MyViewController继承UIViewController而不是UINavigationController)。我还应该对MyViewController做什么来启动与ABPeoplePickerNavigationController相同的方式?
答案 0 :(得分:4)
我想像'ABPeoplePickerNavigationController'一样启动模态视图控制器,而不必创建包含视图控制器的导航控制器
但这正是ABPeoplePickerNavigationController正在做的事情。它不是魔术,它是一个UINavigationController,它在内部实例化一个UIViewController(一个用你的地址簿联系人填充的UITableView),并将UIViewController设置为它的根视图。
您确实可以创建自己的类似UINavigationcontroller子类。但是,在它的初始化程序中,您需要创建一个视图控制器,以便像ABPeoplePickerNavigationController那样加载其根视图。
然后你就可以这样做了:
[self presentModalViewController:myCutsomNavigationController animated:YES];
在您发布的代码中:
@interface MyViewController : UINavigationController
@implementation MyViewController
- (id)init {
NSLog(@"MyViewController init invoked");
if (self = [super initWithNibName:@"DetailView" bundle:nil]) {
self.title = @"All Things";
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"All Things - 2";
}
@end
我怀疑你有NIB问题。没有“rootViewController”插座可以连接。这就是你有一个空白屏幕的原因。
你应该在内部使用的初学者是:
self = [super initWithRootViewController:myCustomRootViewController];