Ich bekomme ein seltsames Verhalten mit presentViewController:animated:completion
. Was ich mache, ist im Wesentlichen ein Ratespiel.
Ich habe einen UIViewController
(frequenzViewController), der einen UITableView
(frequenzTableView) enthält. Wenn der Benutzer auf die Zeile in questionTableView tippt, die die richtige Antwort enthält, sollte eine Ansicht (korrektViewController) instanziiert und ihre Ansicht als modale Ansicht vom unteren Bildschirmrand nach oben verschoben werden. Dies teilt dem Benutzer mit, dass er eine richtige Antwort hat, und setzt den dahinter liegenden frequenzViewController für die nächste Frage zurück. Der korrekte ViewController wird auf Knopfdruck geschlossen, um die nächste Frage anzuzeigen.
Dies alles funktioniert jedes Mal korrekt und die Ansicht des korrekten ViewControllers wird sofort angezeigt, solange dies der Fall presentViewController:animated:completion
ist animated:NO
.
Wenn ich setze animated:YES
, wird korrekter ViewController initialisiert und ruft auf viewDidLoad
. Allerdings viewWillAppear
, viewDidAppear
und der Abschluss - Block aus presentViewController:animated:completion
nicht aufgerufen werden . Die App sitzt nur da und zeigt immer noch den Frequenz-ViewController an, bis ich ein zweites Mal tippe. Jetzt werden viewWillAppear, viewDidAppear und der Abschlussblock aufgerufen.
Ich habe ein bisschen mehr nachgeforscht, und es ist nicht nur ein weiterer Tipp, der dazu führt, dass es weitergeht. Wenn ich mein iPhone neige oder schüttle, kann dies auch dazu führen, dass es viewWillLoad usw. auslöst. Es ist, als würde es auf andere Benutzereingaben warten, bevor es fortschreitet. Dies geschieht auf einem echten iPhone und im Simulator, was ich durch Senden des Shake-Befehls an den Simulator bewiesen habe.
Ich bin wirklich ratlos, was ich dagegen tun soll ... Ich würde mich über jede Hilfe freuen, die jemand leisten kann.
Vielen Dank
Hier ist mein Code. Es ist ziemlich einfach ...
Dies ist Code in questionViewController, der als Delegat für questionTableView fungiert
- (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];
}];
}
}
Dies ist der gesamte korrekte ViewController
@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
Bearbeiten:
Ich habe diese Frage früher gefunden: UITableView und presentViewController benötigen 2 Klicks, um angezeigt zu werden
Und wenn ich meinen didSelectRow
Code in diesen Code ändere , funktioniert es sehr schnell mit Animationen ... Aber es ist chaotisch und macht keinen Sinn, warum es überhaupt nicht funktioniert. Also zähle ich das nicht als Antwort ...
- (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:
die ausgelöst werden soll, mit einer großen Verzögerung beginnt. Dies scheint ein Fehler in iOS 7 zu sein und wird auch in den Apple Dev Forums behandelt.