Como chamar automaticamente um método depois estalando um controlador de vista da pilha no iPhone

StackOverflow https://stackoverflow.com/questions/1001441

  •  05-07-2019
  •  | 
  •  

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!

Foi útil?

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. UIViews 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.

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