Aggiunta di un avviso Visualizza a viewWillAppear, iPhone
-
22-07-2019 - |
Domanda
Sto tentando di mostrare una vista di avviso non appena appare la vista (senza usare un pulsante). In viewcontroller.m ho:
- (void) viewWillAppear:(BOOL)animated
{
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle: @"User Information" message: @"Hello"
delegate: self cancelButtonTitle:nil otherButtonTitles: @"Continue", nil];
[alert show];
[alert release];
}
e in viewcontroller.h ho:
IBOutlet UIView *alert;
Non ho fatto nulla al mio file .xib.
Quando eseguito sul simulatore ottengo quanto segue in console:
30/11/2009 23: 41: 36.079 BatteryApp [867: 20b] *** App di terminazione a causa dell'eccezione non rilevata 'NSInternalInconsistencyException', motivo: '- [UIViewController _loadViewFromNibNamed: bundle:] ha caricato il " BatteryAppViewController " pennino ma la presa di visualizzazione non era impostata. "
Qualche idea in cui ho sbagliato, qualcosa a che fare con il mio xib?
Modifica // Collego l'avviso a una nuova vista nel mio xib, ancora senza fortuna
Soluzione
Il problema è che le due animazioni principali (quella per visualizzare la vista corrente e quella per mostrare l'avviso) si sovrappongono. È necessario separare queste due mosse di animazione, seguendo questa soluzione alternativa:
-
Il codice di avviso deve essere in
viewDidAppear
, piuttosto cheviewWillAppear
-
Chiama
[alert performSelector: @selector (show) conObject: zero afterDelay: 0.0]
. Ciò garantisce che l'avviso si verifichi al termine dell'animazione corrente.
Potrebbe essere necessario stare ancora attenti a rilasciare alert
. Se fossi in te, avrei un metodo separato (ad esempio showHelloAlert), e quindi lo chiamerei da viewDidAppear:
- (void)viewDidAppear: (BOOL)animated {
[self performSelector:@selector(showHello) withObject:nil afterDelay:0.0f];
[super viewDidAppear:animated];
}
Altri suggerimenti
Prova a mettere l'avviso in viewDidAppear.
Inoltre, a cosa serve l'iboutlet? Prova a togliere tutto.
Apri il tuo file xib in Interface Builder e controlla il trascinamento dal proprietario del file (che dovrebbe essere di classe BatteryAppViewController
) alla tua vista (non l'avviso) e seleziona la vista dal menu che si apre . Il registro indica che non hai effettuato questa connessione outlet.
Non connetti UIAlerts in Interface Builder. Gli avvisi non hanno pennini personalizzabili, quindi non è possibile caricarli nel generatore di interfaccia. Devi rimuovere:
IBOutlet UIView *alert;
... completamente.
Il messaggio di errore indica che non è stata definita alcuna vista per il controller della vista. È necessario configurarlo in Interface Builder.