У мене виникає якась дивна поведінка presentViewController:animated:completion
. Що я роблю, це по суті гра в здогадки.
У мене є UIViewController
(frequencyViewController), що містить UITableView
(frequencyTableView). Коли користувач натискає на рядок, що містить questionTableView, що містить правильну відповідь, слід створити екземпляр подання (correctViewController), а його подання повинно ковзати з нижньої частини екрана як модальний вигляд. Це повідомляє користувачеві, що вони мають правильну відповідь, і скидає FrequViewController за ним, готовий до наступного питання. pravilViewController відхиляється натисканням кнопки, щоб виявити наступне питання.
Все це працює правильно кожного разу, і правильний виглядViewController відображається миттєво стільки, скільки presentViewController:animated:completion
було animated:NO
.
Якщо я встановив цей параметр animated:YES
, правильнийViewController ініціалізується та здійснює дзвінки в viewDidLoad
. Тим НЕ менше viewWillAppear
, viewDidAppear
і блок завершення від presentViewController:animated:completion
не називаються. Додаток просто сидить там і досі показує frequencyViewController, доки я не здійсню другий тап. Тепер викликаються viewWillAppear, viewDidAppear та блок завершення.
Я дослідив трохи більше, і це не просто черговий кран, який змусить його продовжуватись. Здається, якщо я нахилити або похитнути свій iPhone, це також може призвести до його запуску viewWillLoad і т. Д. Це все одно, що він чекає будь-якого іншого шматочка входу користувача, перш ніж він прогресує. Це відбувається на справжньому iPhone та в тренажері, що я довів, надіславши команду shake на симулятор.
Я справді не знаю, що з цим робити ... Я б дуже вдячний будь-якій допомозі, яку будь-хто може надати.
Дякую
Ось мій код. Це досить просто ...
Це код у 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.