Mam dziwne zachowanie z presentViewController:animated:completion
. To, co tworzę, jest zasadniczo grą w zgadywanie.
Mam UIViewController
(frequencyViewController) zawierające UITableView
(frequencyTableView). Gdy użytkownik naciśnie wiersz w questionTableView zawierający poprawną odpowiedź, należy utworzyć wystąpienie widoku (correctViewController), a jego widok powinien przesuwać się w górę od dołu ekranu jako widok modalny. To mówi użytkownikowi, że ma poprawną odpowiedź i resetuje frequencyViewController za nią, gotowy do następnego pytania. correctViewController jest odrzucany po naciśnięciu przycisku, aby wyświetlić następne pytanie.
To wszystko poprawnie działa za każdym razem, a pogląd correctViewController pojawiają się natychmiast, o ile presentViewController:animated:completion
ma animated:NO
.
Jeśli animated:YES
ustawię, correctViewController jest inicjowany i wywołuje viewDidLoad
. Jednak viewWillAppear
, viewDidAppear
i blok uzupełniania z presentViewController:animated:completion
nie są wywoływane. Aplikacja po prostu siedzi tam i nadal wyświetla frequencyViewController, dopóki nie zrobię drugiego dotknięcia. Teraz wywoływane są viewWillAppear, viewDidAppear i blok uzupełniania.
Zbadałem trochę więcej i nie tylko kolejne dotknięcie spowoduje kontynuację. Wygląda na to, że jeśli przechylę lub potrząśnie moim iPhonem, może to również spowodować uruchomienie funkcji viewWillLoad itp. To tak, jakby czekał na jakikolwiek inny element danych wejściowych użytkownika, zanim się on rozwinie. Dzieje się to na prawdziwym iPhonie iw symulatorze, co udowodniłem wysyłając polecenie wstrząśnięcia do symulatora.
Naprawdę nie wiem, co z tym zrobić ... Byłbym wdzięczny za każdą pomoc, jakiej ktoś może udzielić.
Dzięki
Oto mój kod. To całkiem proste ...
To jest kod w questionViewController, który działa jako delegat do 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];
}];
}
}
To jest całość correctViewController
@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
Edytować:
Znalazłem to pytanie wcześniej: UITableView i presentViewController wymagają 2 kliknięć, aby wyświetlić
A jeśli zmienię didSelectRow
kod na ten, działa to bardzo długo z animacją ... Ale jest bałagan i nie ma sensu, dlaczego nie działa w pierwszej kolejności. Więc nie liczę tego jako odpowiedź ...
- (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:
ma się uruchamiać z dużym opóźnieniem. Wydaje się, że jest to błąd w iOS 7 i jest również omawiany na forach Apple Dev.