Domanda

Ho bisogno di aiuto nella scelta della soluzione 'giusta' per la seguente 'problema'.

Io uso la nuova funzione storyboard di collegare tutti gli schermi della mia domanda insieme. In pratica la struttura in profondità per:

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

** (e alcune altre schede che sono per il momento non è importante) *

Ho allegato un segue (push) dal primo controllore Vista (1 #) al controller della vista dietro il Tab Bar Controller. Questa spinta viene attivato quando gli utenti presse qualcosa sul primo controller e funziona bene.

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

Quando l'utente (che ora è in Controller View 2 #) preme il pulsante Indietro nella barra di navigazione l'utente torna indietro. Supponiamo che ora innesca la segue di nuovo, il secondo controllore vista viene nuovamente mostrato ma è ora 'resettato' (vuoto). (Credo che dopo aver letto diverse sedi e articoli questo è il comportamento standard quando si utilizza segue di perché questi distruggere e reinitiliaze il controller della vista è ogni volta?)

(controllore vista essendo resettato) pone un problema in quanto il contenuto della seconda vista del regolatore è dinamico (dipendono da una risposta JSON dal server) e quindi è 'necessario' che il controller della vista rimane intatto (o è restaurato) quando l'utente ritorna.

ho trovato diverse fonti (vedi in basso) che descrive lo stesso problema, ma le soluzioni variare e ho bisogno di aiuto raccogliendo quello giusto.

In sintesi:

  • Come faccio a 'trattenere' / Salva lo stato di un controller di vista quando la presse utenti di nuovo, pur mantenendo l'uso di Storyboard e preferibilmente anche di Segue

I pensieri propri:

1 # ora sto pensando di caching della risposta JSON per la mia classe Singleton (e da lì a un PLIST) e controllando entro il secondo controller della vista se questo dato è presente e di ricostruire la vista dopo di che ho verificare la presenza di eventuali nuovi dati (riprendere il normale funzionamento).

2 # Un altro sto pensando è 'bypassando' la segue e manualmente gestire l'interruttore di punti di vista, in parte spiegata in ( storyboard - fare riferimento a viewController in AppDelegate ) - E 'questo anche possibile

?

Ma forse c'è una scelta più facile / migliore?

http: / /www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-using-storyboards.html Storyboard - fare riferimento a ViewController in AppDelegate come serializzare un UIView?

È stato utile?

Soluzione 2

Per chi viene in questo (la mia) domanda in futuro, questo è come ho finito per 'codifica' esso.

  • Apri lo storyboard e selezionare il 'Tab Bar Controller' e aprire l'Attributi

  • compilare un 'identificatore' nel campo

  • Con il controller prima vista (vedere lo scenario nel post originale) creo un riferimento globale alla viewcontroller:

firstviewcontroller.h

@interface YourViewController : UIViewController {

    UITabBarController *tabController;

}

firstviewcontroller.m

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

Ora al passaggio dalla firstviewcontroller la seguente riga può essere utilizzato:

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

Altri suggerimenti

Yess !! Ho ottenuto la soluzione. Fare quanto segue:

sei file h:

@property (strong, nonatomic) UITabBarController *tabController;

sei file di .m:

@synthesize tabController;

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

L'indice selezionato è la scheda che si desidera andare

tabController.selectedIndex = 1;

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

Questo potrebbe essere ancora la soluzione più semplice (senza utilizzare le proprietà - di fatto, tutte le istanze di classe non hanno bisogno di conoscere i loro controllori di destinazione, quindi basta salvarlo come static nella funzione di spinta):

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 è solo la mia variante di NSLog.

Ma è davvero interessante come fare questo con segue?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top