Saya mendapatkan beberapa perilaku aneh dengan presentViewController:animated:completion
. Apa yang saya buat pada dasarnya adalah permainan menebak.
Saya memiliki UIViewController
(frequencyViewController) yang berisi UITableView
(frequencyTableView). Ketika pengguna mengetuk baris di questionTableView yang berisi jawaban yang benar, tampilan (correctViewController) harus dibuat dan tampilannya harus meluncur ke atas dari bawah layar, sebagai tampilan modal. Ini memberi tahu pengguna bahwa mereka memiliki jawaban yang benar dan menyetel ulang frequencyViewController di belakangnya untuk pertanyaan berikutnya. correctViewController diberhentikan dengan menekan tombol untuk menampilkan pertanyaan berikutnya.
Ini semua bekerja dengan benar setiap saat, dan tampilan correctViewController muncul secara instan selama presentViewController:animated:completion
itu animated:NO
.
Jika saya set animated:YES
, correctViewController diinisialisasi dan melakukan panggilan ke viewDidLoad
. Namun viewWillAppear
,, viewDidAppear
dan blok penyelesaian dari presentViewController:animated:completion
tidak dipanggil. Aplikasi hanya ada di sana dan masih menampilkan frequencyViewController sampai saya membuat ketukan kedua. Sekarang, viewWillAppear, viewDidAppear dan blok penyelesaian dipanggil.
Saya menyelidiki lebih lanjut, dan bukan hanya ketukan lain yang akan menyebabkannya berlanjut. Tampaknya jika saya memiringkan atau mengguncang iPhone saya, ini juga dapat menyebabkannya memicu viewWillLoad dll. Ini seperti menunggu masukan pengguna lain sebelum maju. Ini terjadi pada iPhone asli dan di simulator, yang saya buktikan dengan mengirimkan perintah goyang ke simulator.
Saya benar-benar bingung apa yang harus saya lakukan tentang ini ... Saya sangat menghargai bantuan yang dapat diberikan siapa pun.
Terima kasih
Ini kode saya. Ini sangat sederhana ...
Ini adalah kode di questionViewController yang bertindak sebagai delegasi ke 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];
}];
}
}
Ini adalah keseluruhan dari 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
Edit:
Saya menemukan pertanyaan ini sebelumnya: UITableView dan presentViewController membutuhkan 2 klik untuk ditampilkan
Dan jika saya mengubah didSelectRow
kode saya menjadi ini, itu bekerja sangat lama dengan animasi ... Tapi itu berantakan dan tidak masuk akal mengapa itu tidak berhasil di tempat pertama. Jadi saya tidak menganggap itu sebagai jawaban ...
- (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:
seharusnya memicu dimulai dengan penundaan besar. Ini tampaknya menjadi bug di iOS 7 dan juga dibahas di Forum Pengembang Apple.