Pergunta

A questão da raiz é "quantos UIViewControllers você pode empurrar a pilha de navegação?" sem causar avisos de memória ou ganhar uma terminação cão de guarda.

Suponha que eu tenho um aplicativo que é basicamente um banco de dados para três entidades, onde cada um pode ter uma relação com alguma outra entidade, ea relação é mostrado em um UIViewController. Os usuários podem seguir essas relações e cada um traz um novo controlador - Se as entidades são A, B e C e A-> B-> C-> B-> C-> A então cada tipo de visão está na pilha duas vezes . Eu entendo como push e pop, como empurrar de volta para um controlador especial, e eu acho que ao invés de apenas estender a pilha de navegação por tempo indeterminado que poderia ser melhor para reutilizar um controlador de vista na pilha de navegação.

Para fazer isso, cada vez que eu queria um FirstEntityViewController eu poderia digitalizar a pilha de navegação para encontrar um objeto onde [self isKindOfClass:[FirstEntityViewController class]]; e, em seguida, chamar métodos projetados de adaptar essa visão para o que eu atualmente quero ver - basta atualizar os dados da mesma forma você faz quando reutilizando um UITableViewCell.

Isso é bom, exceto para o efeito que pode ter sobre o NavigationController. Se eu usar UINavigationController:popToViewController:animated: eu acho que vai tudo descarte acima da vista Eu estou estourando para, incluindo o ponto de vista que os espera do usuário para encontrar on tapping "Voltar" na barra de navegação. Assim usuário toca um relacionamento, torneiras de volta e vai "huh?"

Se eu remover o controlador correspondente da pilha de navegação e, em seguida, colocá-la para o topo da pilha o comportamento volta permanece OK, desde que o usuário não voltar tão longe como a instância de FirstEntityViewController que foi movido ou navegação novamente mais vai parecer inconsistente.

é a solução certa para remover o controlador da pilha, e de alguma forma segurar um lugar na pilha de modo que quando o controlador reutilizado é estalado ele pode ser substituído de volta de onde veio? Devo manter minha própria lista de vista amável e exibir dados de modo que quando popping posso substituir a visão abaixo da vista sobre a pop para, ficar um passo à frente de navegação de volta?

ou isso é apenas ficando muito complicado? Será que não há necessidade de se preocupar mesmo sobre esta situação porque o OS reutiliza grande parte dos controladores de vista da mesma forma como UITableViewCells são reutilizados, e não há memória real ou impacto no desempenho em ter uma pilha de navegação de 50 profundo?

Foi útil?

Solução

casos viewcontroller permanecer na pilha do UINavigationController, mas qualquer ponto de vista, exceto para a vista superior podem ser descarregadas a qualquer momento (o controlador de vista é notificado via a mensagem viewDidUnload).

Em outras palavras, os pontos de vista debaixo da vista superior não pendurar ao redor e, eventualmente, ser descarregado em condições de pouca memória, por isso não há necessidade de você tentar re-utilizar seus controladores de vista.

Outras dicas

Última vez que verifiquei que você não pode empurrar uma viewcontroller que já está em uma parte traseira pilha NavController para ele novamente. Você terá que criar uma nova viewcontroller e empurrá-lo para a pilha e cada botão de volta irá aparecer que um fora da pilha. O melhor que você pode fazer é fazer um esconderijo de viewcontrollers e distribuir-los quando necessário - contanto que eles estão retirado da pilha NavController. Mas ele provavelmente não vai comprar-lhe muito por meio de economia de memória.

UITableViews são um pouco diferente, já que há apenas um número relativamente pequeno de células em vista a qualquer momento e, logo que a célula passa fora da tela é removida e voltou para a piscina. Se você pode garantir que a maxdepth de sua cadeia é fixo, então você pode puxar um esquema de janelas similar. Se não, você pode ter que ficar com indo profundo e ser vigilante sobre a liberação de memória assim que você puder.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top