で奇妙な動作が発生していpresentViewController:animated:completion
ます。私が作っているのは、本質的に推測ゲームです。
私が持っているUIViewController
(frequencyViewController)を含むUITableView
(frequencyTableViewを)。ユーザーが正解を含むquestionTableViewの行をタップすると、ビュー(correctViewController)がインスタンス化され、そのビューがモーダルビューとして画面の下から上にスライドするはずです。これは、ユーザーに正しい答えがあることを知らせ、次の質問に備えて、その背後にあるfrequencyViewControllerをリセットします。ボタンを押すと、次の質問を表示するためにcorrectViewControllerが閉じます。
これはすべて正しく機能し、正しいビューコントローラのビューはがある限り即座に表示されpresentViewController:animated:completion
ますanimated:NO
。
設定するとanimated:YES
、correctViewControllerが初期化され、を呼び出しますviewDidLoad
。しかしviewWillAppear
、viewDidAppear
、およびから完了ブロックがpresentViewController:animated:completion
呼び出されません。アプリはそこに座って、2回目のタップを行うまでfrequencyViewControllerを表示しています。これで、viewWillAppear、viewDidAppear、および完了ブロックが呼び出されます。
私はもう少し調査しました、そしてそれがそれを続けることを引き起こすもう一つのタップではありません。iPhoneを傾けたり振ったりすると、viewWillLoadなどがトリガーされる可能性があります。他のユーザー入力を待ってから進行するようです。これは、実際のiPhoneとシミュレーターで発生します。これは、shakeコマンドをシミュレーターに送信して確認しました。
私はこれについて何をすべきかについて本当に途方に暮れています...私は誰もが提供できるあらゆる助けに本当に感謝します。
ありがとう
これが私のコードです。とてもシンプルです...
これは、questionTableViewのデリゲートとして機能するquestionViewControllerのコードです。
- (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];
}];
}
}
これは正しい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
編集:
私は以前にこの質問を見つけました:UITableViewとpresentViewControllerは2クリックで表示されます
そして、didSelectRow
コードをこれに変更すると、アニメーションで非常にうまく機能します...しかし、面倒で、そもそもなぜ機能しないのか理解できません。だから私はそれを答えとして数えません...
- (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:
開始が大幅に遅れてトリガーされるはずのアニメーションにすぎないようです。これはiOS 7のバグのようで、Apple Dev Forumsでも議論されています。