Como chamar automaticamente um método depois estalando um controlador de vista da pilha no iPhone
Pergunta
Eu preciso atualizar a vista principal em um iPhone depois de tomar uma vista criança fora da pilha de navegação. Como posso configurar a vista principal para ser notificado ou receber uma chamada de método automático quando a criança é retirado da pilha e o pai se torna visível novamente?
O usuário insere dados na página filho que eu quero mostrar na página pai depois que o usuário é feito e aparece a vista.
Obrigado por você ajuda!
Solução
Eu só resolvido esse mesmo problema de auto -. E as respostas acima são quase correta, eles simplesmente se esqueceu de definir o delegado
Eu tenho um controlador de vista raiz que exibe o tamanho de uma lista, chama um controlador de vista da criança, que pode alterar o tamanho de uma lista, e deve atualizar o tamanho em cima do retorno.
Quando crio meu ponto de vista dos pais (SettingsView abaixo), e adicioná-lo como a exibição de raiz de um UINavigationController, eu certifique-se de definir o delegado do UINavigationController antes de eu apresentar a vista - que é a peça-chave:
SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv];
[nc setDelegate:sv];
Na vista principal, implementar o protocolo UINavigationControllerDelegate:
@interface SettingsView : UIViewController <UINavigationControllerDelegate>
e fornecer o método willShowViewController:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// Your code to update the parent view
}
Este é chamado após o ponto de vista da criança é rejeitado, e antes da vista principal é exibida novamente.
Outras dicas
Eu tive a necessidade de fazer algo assim também. No ViewController que possuía a minha UINavigationController , eu tive que implementar willShowViewController , como este:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}
Esse método é chamado sempre que o UINavigationController muda pontos de vista. Se eu estou entendendo sua pergunta, eu acho que isso deve fazer o que quiser.
Eu acho que há alguma confusão aqui. UIView
s não são empurrados para e bateu de pilha do UINavigationController
. O que está sendo empurrado e estalou é UIViewControllers
, que por sua vez pega um ou (mais frequentemente) vários pontos de vista cada um.
Felizmente, o UIViewController
tem esses métodos:
-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;
Estes são chamados sempre que a visualização está prestes a (des) aparecer, ou tem apenas (des) apareceu. I trabalha com barras de guia, vistas modais e controladores de navegação. (E é uma boa idéia para fazer uso delas quando você implementar controladores personalizados.)
Assim, no seu caso, se bem entendi, você simplesmente tem que substituir o viewWillAppear
: ou viewDidAppear
: método em que você chama de "página-pai" (que é presumivelmente tratado por um UIViewController
) e colocar no código para atualizar o aparência da página de modo a reflectir os dados acabado de entrar.
(Se bem me lembro, você deve se certificar de que o UINavigationController
recebe uma mensagem viewWill/DidAppear:
quando ele é exibido em primeiro lugar, para que essas mensagens para mais tarde ser enviados para seus controladores criança. Se você configurá-lo com um modelo ou em IB você provavelmente não precisa se preocupar com isso.)
Felixyz resposta fez o truque para mim. Chamando a visão aparecerá método irá executar o código nele cada vez que o ponto de vista parece. Diferente de vista fez carga, o qual é executado o seu código apenas quando a visão é carregada pela primeira vez. Portanto, sua vista pai não iria atualizar-se se uma visão da criança alterada a informação exibida no pai, e foi, em seguida, bateu fora o saco. Mas, se as chamadas de pais ver aparecerá, o código obtém ran cada vez que os shows vista backup.
Certifique-se de chamar o método de super ao mesmo tempo. A aplicação adequada ficaria assim:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"View Appearing");
}
Se você precisa notificar um controlador para outro você pode usar padrão delegação conforme descrito aqui (ver segunda resposta) .
Infelizmente não há nenhuma notificação automática (AFAIK) para a tarefa exata como você descreveu. Para atender às suas necessidades você pode enviar mensagem para delegado (ou seja, ao seu controlador pai) em viewWillDisappear função de seu controlador criança.