我用 presentViewController:animated:completion
做了一些奇怪的动作,我做的实际上是一个猜谜游戏。
我有一个包含 UITableView
的 UIViewController
(channel encyViewController)。当用户点击 questions TableView 中包含正确答案的那一行时,视图应该被实例化,并且它的视图应该从屏幕底部向上滑动,作为一个模态视图。这告诉用户他们得到了一个正确的答案,并重置其后面的班次 ViewController,为下一个问题做好准备。在按下一个按钮时,会显示下一个问题。
每次都能正常工作,只要 presentViewController:animated:completion
有 animated:NO
,则会立即显示正确的 ViewController 视图。
如果我设置了 animated:YES
,则会初始化 oretViewController 并调用 viewDidLoad
。但是,不调用 viewWillAppear
、 viewDidAppear
和来自 presentViewController:animated:completion
的完成块。该应用程序只是坐在那里,仍然显示的频率视图控制器,直到我作出第二次点击。现在,viewWillAppear、 viewDidAppear 和完成块被调用。
我又调查了一下,这不仅仅是另一次轻敲,会导致它继续下去。似乎如果我倾斜或摇晃我的 iPhone,这也可以导致它触发 viewWillLoad 等。它就像是在等待用户输入的任何其他位之后才会进行处理。这发生在真正的 iPhone 和模拟器上,我通过向模拟器发送晃动命令证明了这一点。
我真的不知道该怎么办... 我真的很感激任何人能提供的帮助。
谢谢
这是我的代码,很简单..。
这是 questions ViewController 中的代码,它充当 questions TableView 的委托
- (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];
}];
}
}
这是整个 rectViewController
@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 和 presViewController 需要点击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];
}];
}