Domanda

Ho un'applicazione multi-view con singoli UIViewController e xibs. Ho una vista che è la vista di gioco e ogni volta che la chiamo voglio che si reinizializzi, con ciò intendo riavviare alla sua condizione iniziale e non nello stato in cui l'ho lasciata l'ultima volta.

Ecco il blocco di codice che sto usando per caricare e rimuovere le viste:

-(void)loadStartViewController {
[currentView.view removeFromSuperview];
StartViewController *startViewController = [[StartViewController alloc] initWithNibName:@"StartView" bundle:nil];
[window addSubview:startViewController.view];
currentView = startViewController;

}

Dovrei essere più chiaro qui. Ho un UIViewController e un xib che compongono la vista mentre il gioco è in corso. Chiamano un metodo in una vista UIV per disegnare programmaticamente la vista. Lascio l'UIViewController quando il gioco termina e vado a una schermata dei punteggi. Voglio che l'utente si riavvii e torni nel gioco, IE carica UIViewController con il codice sopra, ma inizia con un nuovo gioco, tutte le impostazioni sono nel metodo chiamato. Potrei semplicemente impostare una variabile e passarla tra UIViewController, ma ho pensato che ci potesse essere un comando che mi permettesse di ripristinare il gioco UIViewController in modo che non ricordi nulla sullo stato alla fine dell'ultima partita.

Per farlo funzionare ho scritto un metodo per ripristinare tutte le variabili in UIView che disegna la schermata di gioco e chiama quel metodo da UIViewController nella sezione viewDidLoad.

È stato utile?

Soluzione

Suppongo che la tua vista mostri alcuni dati memorizzati nel modello (stato del gioco). Quindi non vorresti ripristinare lo stato del gioco e lasciare che la vista lo visualizzasse? La vista è gestita (caricata / rilasciata / ricaricata) dal sistema quando deve essere visualizzata o rilasciata quando la memoria del telefono è insufficiente. Quindi, se gestisci il tuo stato di gioco separatamente, dovresti aggiornare lo stato del gioco (il modello) e lasciare che la vista lo mostri.

Cosa intendi con il mio " chiamando la vista " ;? Intendi quando passi da un "menu" a "una schermata di gioco"?

Forse ricaricare lo stato del gioco dopo la visualizzazione della vista sarebbe di aiuto. Ci sono alcuni delegati come viewDidLoad ma la mia comprensione è che vengono chiamati dopo il caricamento della vista. Tuttavia, se stai esaurendo la memoria, la tua vista potrebbe essere rilasciata e ricaricata in seguito, quindi immagino che dovresti gestire il gioco 'stato' te stesso nell'oggetto modello e lasciare che la vista lo mostri solo.

Non sono sicuro che possa essere d'aiuto, non sono del tutto sicuro di cosa intendessi per "chiamare la vista".

Altri suggerimenti

Invece di tenere traccia di quale vista è attualmente visualizzata, usa un UINavigationController. Ecco a cosa servono. In applicationDidFinishLaunching nel delegato dell'app:

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:startViewController];

Crea una variabile di istanza in startViewController e passale un puntatore al controller di navigazione dopo averla creata. Quindi, quando vuoi andare al gioco:

[self.navigationController pushViewController:gameViewController animated:YES];

o non animato, qualunque cosa. Probabilmente vorrai anche nascondere la barra di navigazione con:

[self.navigationController setNavigationBarHidden:YES animated:NO];

Quando il gioco termina, puoi continuare a spingere qualunque vista tu voglia, e puoi sempre tornare alla prima vista con:

[self.navigationController popToRootViewControllerAnimated:YES];

Oh, e per quanto riguarda la reinizializzazione del gioco ogni volta che giochi, basta implementare

-(void)viewWillAppear:(BOOL)animated{}

nel controller di visualizzazione del gioco ed esegui qualsiasi inizializzazione desideri. Anche se onestamente non sono sicuro al 100% che dovresti usarlo con un .xib ... Uso raramente Interface Builder quindi non ne sono sicuro. Ma penso che funzionerebbe.

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