Estoy teniendo un comportamiento extraño con presentViewController:animated:completion
. Lo que estoy haciendo es esencialmente un juego de adivinanzas.
Tengo un UIViewController
(FrequencyViewController) que contiene un UITableView
(FrequencyTableView). Cuando el usuario toca la fila en questionTableView que contiene la respuesta correcta, se debe crear una instancia de una vista (correctViewController) y su vista debe deslizarse hacia arriba desde la parte inferior de la pantalla, como una vista modal. Esto le dice al usuario que tiene una respuesta correcta y restablece el FrequencyViewController detrás de él listo para la siguiente pregunta. correctViewController se descarta al presionar un botón para revelar la siguiente pregunta.
Todo esto funciona correctamente cada vez, y la vista de la vista correcta de ViewController aparece instantáneamente siempre que lo presentViewController:animated:completion
haya hecho animated:NO
.
Si lo configuro animated:YES
, correctViewController se inicializa y realiza llamadas a viewDidLoad
. Sin embargo viewWillAppear
, viewDidAppear
y el bloque de finalización de presentViewController:animated:completion
no se llaman. La aplicación se queda ahí y sigue mostrando FrequencyViewController hasta que hago un segundo toque. Ahora, se llaman viewWillAppear, viewDidAppear y el bloque de finalización.
Investigué un poco más, y no es solo otro toque lo que hará que continúe. Parece que si inclino o sacudo mi iPhone, esto también puede hacer que active viewWillLoad, etc. Es como si estuviera esperando cualquier otra entrada del usuario antes de que progrese. Esto sucede en un iPhone real y en el simulador, lo cual probé enviando el comando de agitar al simulador.
Realmente no sé qué hacer al respecto ... Realmente agradecería cualquier ayuda que alguien pueda brindar.
Gracias
Aquí está mi código. Es bastante simple ...
Este es el código en questionViewController que actúa como delegado de 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];
}];
}
}
Este es el conjunto de 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
Editar:
Encontré esta pregunta antes: UITableView y presentViewController necesitan 2 clics para mostrarse
Y si cambio mi didSelectRow
código a este, funciona muy a tiempo con la animación ... Pero es complicado y no tiene sentido por qué no funciona en primer lugar. Entonces no cuento eso como una respuesta ...
- (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:
se supone que se dispara comienza con un gran retraso. Esto parece ser un error en iOS 7 y también se comenta en los foros de desarrollo de Apple.