iPhone: Como passar dados entre vários Viewcontrollers em um aplicativo de tabulação

Eu tenho seguinte problema:

Eu construí um aplicativo de tabbar com 4 guias. Eu quero passar um object / variável do primeiro controlador de guia para o terceiro e inicializar este controlador com o object correspondente.

Eu já fiz algumas pesquisas. A melhor maneira, correspondendo a uma abordagem de modelo limpo, seria chamar algum método initWithObject: no viewcontroller chamado. Como posso conseguir isso? Como posso chamar o método init do receivercontroller dentro do callercontroller? Você pode me dar algum exemplo de código?

Edit: Para passar dados entre várias visões / classs etc simplesmente crie algum tipo de class de dados que mantenha os dados sendo compartilhados entre várias classs. Para mais informações, siga o link: Singleton

Você precisa de um object de modelo de dados que armazene os dados para o aplicativo.

Um modelo de dados é um object personalizado, autônomo, acessível de qualquer lugar no aplicativo. O object de modelo de dados não sabe nada sobre quaisquer visualizações ou visualizar controladores. Apenas armazena dados e as relações lógicas entre esses dados.

Quando partes diferentes do aplicativo precisam gravar ou ler dados, elas gravam e leem para o modelo de dados. No seu caso, o view1 salvaria seus dados no modelo de dados quando ele descarregasse e, em seguida, o view2 leria esses dados do modelo de dados quando ele fosse carregado (ou vice-versa).

Em um aplicativo adequadamente projetado, nenhum controlador de visualização deve ter access aos dados internos de outro controlador. (A única razão pela qual os controladores de visualização precisam saber da existência de outro controlador é se ele precisa acionar o carregamento desse outro controlador.)

A maneira rápida e suja de criar um modelo de dados é adicionar atributos ao delegado do aplicativo e, em seguida, chamar o representante do aplicativo dos controladores de exibição usando:

 YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate]; myLocalProperty = appDelegate.someDataModelProperty; 

Isso funcionará para projetos pequenos, mas à medida que seus dados se tornam complexos, você deve criar uma class dedicada para o seu modelo de dados.

Editar:

Para esclarecer seu caso específico, você adicionaria a chamada ao modelo de dados quando o viewControl do receptor se tornasse ativo.

Colocar os dados em um método init ou em um viewDidLoad não funcionará porque, em um UITabBar os usuários podem alternar sem descarregar a visualização ou reinicializar o controlador de visualização.

O melhor local para recuperar dados em mudança é o método do controlador viewWillAppear . Dessa forma, os dados serão atualizados sempre que o usuário alternar para essa guia.

Você pode querer considerar o NSNotificationCenter ( Reference ); você registra o viewcontroller com o centro de notificação do aplicativo e envia uma notificação quando uma seleção é feita. Quando a notificação é recebida, o outro viewcontroller se atualiza de acordo.

Eu não acho que esta é a melhor prática (também verificar a syntax) no entanto eu tenho escapado com:

no .h

 otherclassref *otherclassname @property (assign) otherclassname otherclassref; 

e no .m

 @synthesize otherclassref; 

então eu apenas atribuo a referência de algum lugar conveniente, por exemplo, o delegado do aplicativo ou onde quer que você esteja instanciando seus viewcontrollers.

então o controlador de visualização pode obter uma referência ao outro controlador de visualização.

Eu adiciono o @class secondviewcontroller ao arquivo .h para o firstviewcontroller e coloco o #imports “secondviewcontroller.h” no arquivo .m do primeiro view controller. Eles são chamados de referências de encaminhamento e evitam erros do compilador resultantes de arquivos .h referindo-se uns aos outros.