启动模态UINavigationController

时间:2009-06-22 22:47:08

标签: iphone

我想像'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相同的方式?

1 个答案:

答案 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];