UITableViewController инициализируется дважды - PullRequest
0 голосов
/ 23 января 2012

Я пытался модально представить UINavigationController с UITableViewController в качестве корневого представления, но продолжал падать приложение, нажимая кнопку, чтобы отобразить модальное представление.

- (IBAction)flipToDefaultsViewController:(id)sender
{

    RootTableViewController *controller = [[RootTableViewController alloc] initWithNibName:@"RootTableViewController" bundle:nil];

    UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:controller];
    nc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

    [self presentModalViewController:nc animated:YES];
}

Приложение зависало ссообщение:

[RootTableViewController numberOfSectionsInTableView:]: сообщение отправлено на освобожденный экземпляр 0x5677b5

Когда я загрузил Инструменты для дальнейшего просмотра, было очевидно, что два экземплярамои UITableViewController были созданы, один с владельцем UINavigationController, а другой от UIKit.Созданный UIKit экземпляр был освобожден и вызвал сбой.

Когда я изменил инициализацию с initWithNibName:bundle: на init нормально загруженный UITableViewController (мой файл .xib имел то же имя, что икласс).

Мой вопрос: почему это произошло?

Не следует ли инициализировать UITableViewController таким образом при добавлении его в UINavigationController?До сих пор я охотился за документацией, но без радости.

Использование iOS 5 с ARC, но целевое развертывание - 4.0.

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я не выяснил, почему объект инициализировался дважды, однако я просмотрел шаги, которые я использовал для создания файла .xib , и похоже, что существует проблема с копированием представления из раскадровки в Интерфейсный Разработчик. Оглядываясь назад, это имеет смысл, но, поскольку вид, кажется, копируется без ошибок, а все остальное выглядит хорошо, это легко сделать.

Похоже, что подобные проблемы испытывали другие с похожими результатами .

Создав полностью чистый подкласс UITableViewController с nib-файлом (⌘-N) и скопировав код из начального класса в новый, я могу использовать исходный код выше для выделения / инициализации моего модального представления. .

Кстати, я ошибся в своем первом посте о правильной загрузке файла пера при использовании init. Такого не было, и на самом деле такого поведения не происходит для UITableViewController , по-видимому, , поскольку другие классы, имена классов которых совпадают с файлом .xib, будут пытаться сначала загрузить .xib.

0 голосов
/ 23 января 2012

Если это кнопка, то вам не нужно ничего инициализировать при нажатии кнопки. Вы должны инициализировать заранее и просто представить modalViewController при нажатии кнопки.

Есть ли причина, по которой rootViewController и контроллер навигации не могут быть инициализированы в методе appdelegate didFinishLaunchingWithOptions?

...