Sto ottenendo uno strano comportamento con presentViewController:animated:completion
. Quello che sto facendo è essenzialmente un gioco d'ipotesi.
Ho un UIViewController
(frequencyViewController) contenente un UITableView
(frequencyTableView). Quando l'utente tocca la riga in questionTableView contenente la risposta corretta, dovrebbe essere istanziata una vista (correctViewController) e la sua vista dovrebbe scorrere verso l'alto dalla parte inferiore dello schermo, come una vista modale. Questo dice all'utente che ha una risposta corretta e reimposta il frequencyViewController dietro di esso pronto per la domanda successiva. correctViewController viene chiuso alla pressione di un pulsante per rivelare la domanda successiva.
Tutto questo funziona correttamente ogni volta e la vista del correctViewController appare istantaneamente finché presentViewController:animated:completion
ha animated:NO
.
Se imposto animated:YES
, correctViewController viene inizializzato ed effettua chiamate a viewDidLoad
. Tuttavia viewWillAppear
, viewDidAppear
e il blocco di completamento da presentViewController:animated:completion
non vengono chiamati. L'app rimane lì, mostrando ancora frequencyViewController fino a quando non faccio un secondo tocco. Ora vengono chiamati viewWillAppear, viewDidAppear e il blocco di completamento.
Ho indagato un po 'di più e non è solo un altro tocco che lo farà continuare. Sembra che se inclino o scuoto il mio iPhone questo può anche causare l'attivazione del viewWillLoad ecc. È come se aspettasse qualsiasi altro bit di input dell'utente prima che proceda. Questo accade su un vero iPhone e nel simulatore, cosa che ho dimostrato inviando il comando shake al simulatore.
Sono davvero perplesso su cosa fare al riguardo ... Apprezzerei davvero qualsiasi aiuto che qualcuno possa fornire.
Grazie
Ecco il mio codice. È abbastanza semplice ...
Questo è il codice in questionViewController che funge da delegato per questionTableView
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != [self.frequencyModel currentFrequencyIndex])
{
// If guess was wrong, then mark the selection as incorrect
NSLog(@"Incorrect Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
UITableViewCell *cell = [self.frequencyTableView cellForRowAtIndexPath:indexPath];
[cell setBackgroundColor:[UIColor colorWithRed:240/255.0f green:110/255.0f blue:103/255.0f alpha:1.0f]];
}
else
{
// If guess was correct, show correct view
NSLog(@"Correct Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
self.correctViewController = [[HFBCorrectViewController alloc] init];
self.correctViewController.delegate = self;
[self presentViewController:self.correctViewController animated:YES completion:^(void){
NSLog(@"Completed Presenting correctViewController");
[self setUpViewForNextQuestion];
}];
}
}
Questo è tutto il correttoViewController
@implementation HFBCorrectViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// Custom initialization
NSLog(@"[HFBCorrectViewController initWithNibName:bundle:]");
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"[HFBCorrectViewController viewDidLoad]");
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"[HFBCorrectViewController viewDidAppear]");
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)close:(id)sender
{
NSLog(@"[HFBCorrectViewController close:sender:]");
[self.delegate didDismissCorrectViewController];
}
@end
Modificare:
Ho trovato questa domanda in precedenza: UITableView e presentViewController richiedono 2 clic per essere visualizzati
E se cambio il mio didSelectRow
codice in questo, funziona molto tempo con l'animazione ... Ma è disordinato e non ha senso sul motivo per cui non funziona in primo luogo. Quindi non lo considero una risposta ...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != [self.frequencyModel currentFrequencyIndex])
{
// If guess was wrong, then mark the selection as incorrect
NSLog(@"Incorrect Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
UITableViewCell *cell = [self.frequencyTableView cellForRowAtIndexPath:indexPath];
[cell setBackgroundColor:[UIColor colorWithRed:240/255.0f green:110/255.0f blue:103/255.0f alpha:1.0f]];
// [cell setAccessoryType:(UITableViewCellAccessoryType)]
}
else
{
// If guess was correct, show correct view
NSLog(@"Correct Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
////////////////////////////
// BELOW HERE ARE THE CHANGES
[self performSelector:@selector(showCorrectViewController:) withObject:nil afterDelay:0];
}
}
-(void)showCorrectViewController:(id)sender
{
self.correctViewController = [[HFBCorrectViewController alloc] init];
self.correctViewController.delegate = self;
self.correctViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:self.correctViewController animated:YES completion:^(void){
NSLog(@"Completed Presenting correctViewController");
[self setUpViewForNextQuestion];
}];
}
presentViewController:
dovrebbe innescarsi inizia con un grande ritardo. Questo sembra essere un bug in iOS 7 ed è anche discusso nei forum di Apple Dev.