Question

J'ai besoin d'aide pour choisir le « droit » solution pour ce qui suit « problème ».

J'utilise la nouvelle fonctionnalité de story-board pour relier tous les écrans de ma demande ensemble. Fondamentalement, les exercices de structure vers le bas à:

[Navigation Controller] => [View Controller # 1] => [Tabbar Controller] => [View Controller # 2] *

** (et quelques autres onglets qui sont pour l'instant pas d'importance) *

Je joins un Segue (push) du premier View Controller (# 1) au contrôleur Voir derrière le contrôleur barre d'onglets. Cette poussée est déclenchée lorsque la presse des utilisateurs quelque chose sur le premier contrôleur et fonctionne très bien.

// Execute preset segue
[self performSegueWithIdentifier:@"segueEventDetail" sender:self];

Lorsque l'utilisateur (qui est maintenant dans le View Controller # 2) appuie sur le bouton de retour dans la barre de navigation de l'utilisateur retourne. Supposons qu'il déclenche à présent la Segue à nouveau, le second contrôleur de vue est montré à nouveau, mais est maintenant « resetted » (vide). (Je crois après avoir lu plusieurs forums et articles est ce comportement standard lors de l'utilisation de Segue car ceux-ci détruisent et reinitiliaze le contrôleur de vue est à chaque fois?)

(le contrôleur de vue étant remis à zéro) pose un problème parce que le contenu du second contrôleur vue dynamique (dépendent d'une réponse JSON du serveur) et il est donc « nécessaire » que le contrôleur de vue reste intacte (ou est restaurée) lorsque l'utilisateur revient.

J'ai trouvé plusieurs sources (voir en bas) décrivant le même problème, mais les solutions varient et je besoin d'aide pour choisir la bonne.

Résumer:

  • Comment puis-je conserver "/ sauvegarde de l'état d'un View Controller lors du retour des presses utilisateurs, tout en préservant l'utilisation de Storyboard et de préférence aussi de Segue

pensées:

# 1 Je pense maintenant à la mise en cache la réponse JSON à ma classe singleton (et de là à un PLIST) et le contrôle dans le deuxième contrôleur de vue si ces données sont présentes et que la reconstruction de la vue après quoi je vérifie pour toutes les nouvelles données (reprendre un fonctionnement normal).

# 2 Un autre je pense est «sans passer par la Segue et de gérer manuellement le commutateur de vues, explique en partie dans ( storyboard - reportez-vous à ViewController dans appDelegate ) - est-ce possible

?

Mais peut-être il y a une option plus facile / mieux?

http: / /www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-using-storyboards.html Storyboard - voir ViewController à AppDelegate Comment sérialiser un UIView?

Était-ce utile?

La solution 2

Pour ceux qui viennent dans cette (ma) question à l'avenir, voilà comment je fini par « codage », il.

  • Ouvrez le story-board et sélectionnez votre Tab Bar Controller »et ouvrez les attributs de l'inspecteur

  • Remplir un 'identifiant' dans le champ

  • Avec le premier contrôleur de vue (voir scénario post original) je crée une référence mondiale au viewcontroller:

firstviewcontroller.h

@interface YourViewController : UIViewController {

    UITabBarController *tabController;

}

firstviewcontroller.m

//Fill the reference to the tabcontroller using the identifier
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];

Pour passer du firstviewcontroller la ligne suivante peut être utilisée:

[[self navigationController] pushViewController:tabController animated:YES];

Autres conseils

Yess !! Je suis la solution. Procédez comme suit:

vous êtes la .h:

@property (strong, nonatomic) UITabBarController *tabController;

vous êtes la fichier .m:

@synthesize tabController;

tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];

L'indice sélectionné est l'onglet que vous voulez aller

tabController.selectedIndex = 1;

[[self navigationController] pushViewController:tabController animated:YES];

Cela pourrait être une solution encore plus simple (sans utiliser les propriétés - en fait, toutes les instances de classe ne ont pas besoin de connaître leurs contrôleurs de destination, si juste l'enregistrer comme statique dans la fonction de poussée):

static UIVewController *destController = nil;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
if (!storyboard) {
    DLog(Storyboard not found);
    return;
}
if (destController == nil) { //first initialisation of destController
    destController = [storyboard instantiateViewControllerWithIdentifier:@"{Your Destination controller identifyer}"];
    if(!destController) {
        DLog(destController not found)
        return;
    }
}
//set any additional destController's properties;
[self.navigationController pushViewController:destController animated:YES];

p.s. DLog est juste ma variation de NSLog.

Mais il est vraiment intéressant de voir comment faire cela avec Segue?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top