Запуск модального UINavigationController - PullRequest
6 голосов
/ 23 июня 2009

Я бы хотел запустить модальный контроллер представления, как это делается с 'ABPeoplePickerNavigationController', и это без необходимости создания контроллера навигации, содержащего контроллер представления.

Если сделать что-то подобное, откроется пустой экран без заголовка для панели навигации, и для представления не будет загружен связанный файл пера, хотя я вызываю initWithNibName при вызове init.

Мой контроллер выглядит так:

@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

Другой способ создать модальное представление, как предлагается в Руководстве по программированию View Controller от Apple для 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 Ответ

4 голосов
/ 23 июня 2009

Я бы хотел запустить модальный контроллер представления, как это делается с '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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...