İle bazı garip davranışlar alıyorum presentViewController:animated:completion
. Yaptığım şey aslında bir tahmin oyunu.
Bir UIViewController
(FrequencyTableView) içeren bir UITableView
(FrequencyViewController) var. Kullanıcı doğru cevabı içeren söz konusu satıra dokunduğunda, bir görünüm (doğru GörünümController) somutlaştırılmalı ve görünümü modal bir görünüm olarak ekranın altından yukarı kaymalıdır. Bu, kullanıcıya doğru bir cevabı olduğunu söyler ve arkasındaki FrequencyViewController'ı bir sonraki soru için hazır hale getirir. DoğruViewController, bir sonraki soruyu ortaya çıkarmak için bir düğmeye basılarak kapatılır.
Bu, tüm doğru her zaman çalışır ve correctViewController bakış açısı sürece anında görünür presentViewController:animated:completion
vardır animated:NO
.
Eğer ayarlarsam animated:YES
, doğruViewController başlatılır ve viewDidLoad
. Ancak viewWillAppear
, viewDidAppear
ve gelen tamamlama bloğu presentViewController:animated:completion
çağrılmaz. Uygulama, ikinci bir dokunuş yapana kadar hala FrequencyViewController'ı gösteriyor. Şimdi, viewWillAppear, viewDidAppear ve tamamlama bloğu çağrılır.
Biraz daha araştırdım ve devam etmesine neden olacak sadece başka bir dokunuş değil. Görünüşe göre iPhone'umu yana yatırırsam veya sallarsam, bu da viewWillLoad vb. Tetiklemesine neden olabilir. İlerlemeden önce başka bir kullanıcı girdisini bekliyor gibi. Bu gerçek bir iPhone'da ve simülatöre sallama komutunu göndererek kanıtladığım simülatörde oluyor.
Bu konuda ne yapacağımı bilemiyorum ... Herhangi birinin sağlayabileceği her türlü yardımı gerçekten takdir ediyorum.
Teşekkürler
İşte kodum. Oldukça basit ...
Bu, questionViewController'daki, questionTableView için temsilci görevi gören koddur.
- (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];
}];
}
}
Bu, doğruViewController'ın tamamıdır
@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
Düzenle:
Bu soruyu daha önce buldum: UITableView ve presentViewController'ın görüntülenmesi 2 tıklama alıyor
Ve eğer didSelectRow
kodumu buna değiştirirsem , animasyonla çok iyi çalışır ... Ama bu dağınık ve ilk başta neden çalışmadığı konusunda bir anlam ifade etmiyor. Bu yüzden bunu bir cevap olarak saymıyorum ...
- (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:
tetiklemesi gereken sadece animasyon büyük bir gecikmeyle başlıyor. Bu, iOS 7'de bir hata gibi görünüyor ve ayrıca Apple Dev Forumlarında tartışılıyor.