UIViewController пользовательский titleView вылетает приложение
У меня есть приложение для iPhone на основе навигации. Когда вы нажимаете на ячейку в табличном представлении, новый UIViewController помещается в стек навигации. В этом контроллере представления я устанавливаю пользовательский titleView в методе viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
// Setup custom navigation title
[self setTitle:@"Mediaportal"];
navItem = [[NavigationBarTitleItemViewController alloc] initWithNibName:@"NavigationBarTitleItem" bundle:nil];
[navItem setTitle:[theServer name]];
[navItem setSubTitle:@""];
[self.navigationItem setTitleView:navItem.view];
…
}
Как только я переключаюсь обратно на RootViewController:
[self.navigationController popToRootViewControllerAnimated:YES];
приложение вылетает со следующей ошибкой (NSZombieEnabled=YES):
*** -[CALayer retain]: message sent to deallocated instance 0x5a5fd80
Из того, что я вижу, RootViewController все еще пытается получить доступ к пользовательскому titleView, который был освобожден со вторым контроллером представления. Как только я закомментирую часть titleView в моем коде, приложение работает. Я попытался установить для NavigationItem.titleView значение nil (как показано в документах Apple), прежде чем освободить второй ViewController, но это не помогает.
У вас есть подсказка, что я могу сделать, чтобы предотвратить этот сбой?
Спасибо, Марк.
2 ответа
Я наконец нашел решение для этого (довольно простое). Я должен выделить и инициировать navItem через его свойство, после чего он сохраняется:
self.navItem = [[NavigationBarTitleItemViewController alloc] initWithNibName:@"NavigationBarTitleItem" bundle:nil];
У меня была такая же ошибка месяц назад или около того, точно такая же ситуация. Это сводило меня с ума.
Я обнаружил, что viewController, который я тоже высовывал, вообще не был освобожден. У меня был пользовательский подкласс UIButton, добавленный к этому представлению, однако он был освобожден, когда второе представление было выдвинуто. Так что, возвращаясь назад, UIButton там не было.
Проверьте представление, к которому вы возвращаетесь, чтобы убедиться, что у вас нет классов, которые вы освобождаете, или выполняются автоматически, без вашего ведома.
Надеюсь это поможет.