J'ai un comportement étrange avec presentViewController:animated:completion
. Ce que je fais est essentiellement un jeu de devinettes.
J'ai un UIViewController
(frequencyViewController) contenant un UITableView
(frequencyTableView). Lorsque l'utilisateur appuie sur la ligne en questionTableView contenant la bonne réponse, une vue (correctViewController) doit être instanciée et sa vue doit glisser vers le haut à partir du bas de l'écran, sous la forme d'une vue modale. Cela indique à l'utilisateur qu'il a une réponse correcte et réinitialise le FrequencyViewController derrière lui, prêt pour la question suivante. correctViewController est rejeté en appuyant sur un bouton pour révéler la question suivante.
Tout cela fonctionne correctement à chaque fois, et la vue correcteViewController apparaît instantanément aussi longtemps que l' presentViewController:animated:completion
a animated:NO
.
Si je définis animated:YES
, correctViewController est initialisé et fait des appels à viewDidLoad
. Cependant viewWillAppear
, viewDidAppear
et le bloc d'achèvement de presentViewController:animated:completion
ne sont pas appelés. L'application reste juste là et affiche encore frequencyViewController jusqu'à ce que je fasse un deuxième tap. Maintenant, viewWillAppear, viewDidAppear et le bloc de complétion sont appelés.
J'ai enquêté un peu plus, et ce n'est pas simplement un autre robinet qui le fera continuer. Il semble que si j'incline ou secoue mon iPhone, cela peut également provoquer le déclenchement de viewWillLoad, etc. Cela se produit sur un vrai iPhone et dans le simulateur, ce que j'ai prouvé en envoyant la commande shake au simulateur.
Je ne sais vraiment pas quoi faire à ce sujet ... J'apprécierais vraiment toute aide que n'importe qui peut me fournir.
Merci
Voici mon code. C'est assez simple ...
Il s'agit du code en questionViewController qui agit en tant que délégué de la 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];
}];
}
}
C'est l'ensemble du correctViewController
@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
Éditer:
J'ai trouvé cette question plus tôt: UITableView et presentViewController prennent 2 clics pour s'afficher
Et si je change mon didSelectRow
code pour cela, cela fonctionne très souvent avec l'animation ... Mais c'est compliqué et ne comprend pas pourquoi cela ne fonctionne pas en premier lieu. Donc je ne compte pas ça comme une réponse ...
- (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:
est censée déclencher commence avec un gros retard. Cela semble être un bogue dans iOS 7 et est également discuté dans les forums Apple Dev.