У меня странное поведение с presentViewController:animated:completion
. То, что я делаю, - это, по сути, игра в угадывание.
У меня есть UIViewController
(frequencyViewController), содержащий UITableView
(frequencyTableView). Когда пользователь нажимает на строку в questionTableView, содержащую правильный ответ, должно быть создано представление (correViewController), и его представление должно скользить вверх из нижней части экрана, как модальное представление. Это сообщает пользователю, что у него есть правильный ответ, и сбрасывает стоящий за ним frequencyViewController, готовый к следующему вопросу. RightViewController отключается при нажатии кнопки, чтобы открыть следующий вопрос.
Все это работает правильно каждый раз, и правильное представление ViewController появляется мгновенно, пока оно presentViewController:animated:completion
есть animated:NO
.
Если я установил animated:YES
, инициализируется правильноViewController и обращается к viewDidLoad
. Однако viewWillAppear
, viewDidAppear
и блок завершения из presentViewController:animated:completion
не вызываются. Приложение просто сидит и показывает frequencyViewController, пока я не сделаю второе касание. Теперь вызываются viewWillAppear, viewDidAppear и блок завершения.
Я исследовал еще немного, и это не просто еще одно нажатие, которое заставит его продолжить. Кажется, если я наклоню или встряхну свой iPhone, это также может привести к срабатыванию viewWillLoad и т. Д. Это похоже на ожидание любого другого бита пользовательского ввода, прежде чем он будет прогрессировать. Это происходит на реальном iPhone и в симуляторе, что я доказал, отправив на симулятор команду встряхивания.
Я действительно не понимаю, что с этим делать ... Я был бы очень признателен за любую помощь, которую мог бы предоставить.
Благодарность
Вот мой код. Это довольно просто ...
Это код в questionViewController, который действует как делегат для 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];
}];
}
}
Это весь правильный 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.