UIViewController Custom TitleView Crashes App
-
25-09-2019 - |
Pergunta
Eu tenho um aplicativo para iPhone baseado em navegação. Quando você pressiona uma célula na Tabelaview, um novo UIViewController é empurrado para a pilha de navegação. Neste controlador de exibição, estou definindo um titleView personalizado no método 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];
…
}
Depois de voltar para o rootViewController:
[self.navigationController popToRootViewControllerAnimated:YES];
O aplicativo trava com o seguinte erro (nszombieEnabled = sim):
*** -[CALayer retain]: message sent to deallocated instance 0x5a5fd80
Pelo que posso ver, o rootViewController ainda tenta acessar o TitleView personalizado, que foi resolvido com o segundo controlador de exibição. Depois de comentar a parte personalizada do TitleView no meu código, o aplicativo funciona. Tentei definir o NavigationItem.titleview para NIL (como encontrado no Apple Docs) antes que o segundo ViewController seja desalocado, mas isso não ajuda.
Você tem uma dica o que posso fazer para evitar esse acidente?
Obrigado, Mark.
Solução 2
Finalmente encontrei a solução para isso (bastante simples). Eu tenho que alocá -lo e iniciar o Navitem por meio de sua propriedade, então ele está sendo retido:
self.navItem = [[NavigationBarTitleItemViewController alloc] initWithNibName:@"NavigationBarTitleItem" bundle:nil];
Outras dicas
Eu tive exatamente o mesmo erro há um mês, exatamente a mesma situação. Isso me deixou louco.
Descobri que o viewcontroller que eu estava estourando também não havia sido desalocado. Eu tinha uma subclasse de UIBIBLETTON personalizada adicionada a essa visão, no entanto, que havia sido desalocada quando a segunda visão foi pressionada. Então, ao voltar, o UIBIBLETTON não estava lá.
Verifique a visualização para a qual você está voltando, para garantir que você não tenha nenhuma aula que está negociando ou está sendo lançada com autoridade sem saber.
Espero que isto ajude.