Tôi nhận được một số hành vi kỳ lạ với presentViewController:animated:completion
. Những gì tôi đang làm về cơ bản là một trò chơi đoán.
Tôi có một UIViewController
(frequencyViewController) chứa một UITableView
(frequencyTableView). Khi người dùng chạm vào hàng trong questionTableView chứa câu trả lời đúng, một chế độ xem (đúngViewController) sẽ được khởi tạo và chế độ xem của nó sẽ trượt lên từ cuối màn hình, dưới dạng một chế độ xem phương thức. Điều này cho người dùng biết họ có câu trả lời chính xác và đặt lại tần sốViewController đằng sau nó sẵn sàng cho câu hỏi tiếp theo. trueViewController bị loại bỏ khi nhấn nút để hiển thị câu hỏi tiếp theo.
Tất cả điều này đều hoạt động chính xác mọi lúc và chế độ xem của correctViewController xuất hiện ngay lập tức miễn là presentViewController:animated:completion
có animated:NO
.
Nếu tôi đặt animated:YES
, thì trueViewController được khởi tạo và thực hiện các cuộc gọi tới viewDidLoad
. Tuy nhiên viewWillAppear
, viewDidAppear
và khối hoàn thành từ presentViewController:animated:completion
không được gọi. Ứng dụng chỉ nằm ở đó và vẫn hiển thị tần sốViewController cho đến khi tôi nhấn lần thứ hai. Bây giờ, viewWillAppear, viewDidAppear và khối hoàn thành được gọi.
Tôi đã điều tra thêm một chút và không chỉ một lần nhấn nữa sẽ khiến nó tiếp tục. Có vẻ như nếu tôi nghiêng hoặc lắc iPhone của mình, điều này cũng có thể khiến nó kích hoạt viewWillLoad, v.v. Nó giống như việc chờ đợi bất kỳ thao tác nhập liệu nào khác của người dùng trước khi nó tiến hành. Điều này xảy ra trên iPhone thực và trong trình mô phỏng, điều mà tôi đã chứng minh bằng cách gửi lệnh lắc đến trình mô phỏng.
Tôi thực sự lúng túng không biết phải làm gì về điều này ... Tôi thực sự đánh giá cao bất kỳ sự giúp đỡ nào mà bất kỳ ai có thể cung cấp.
Cảm ơn
Đây là mã của tôi. Nó khá đơn giản ...
Đây là mã trong questionViewController hoạt động như đại biểu cho 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];
}];
}
}
Đây là toàn bộ của trueViewController
@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
Biên tập:
Tôi đã tìm thấy câu hỏi này trước đó: UITableView và presentViewController mất 2 lần nhấp để hiển thị
Và nếu tôi thay đổi didSelectRow
mã của mình thành mã này, nó hoạt động rất nhanh với hoạt ảnh ... Nhưng nó lộn xộn và không có ý nghĩa tại sao nó không hoạt động ngay từ đầu. Vì vậy, tôi không tính đó là câu trả lời ...
- (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:
được cho là kích hoạt bắt đầu với độ trễ lớn. Đây dường như là một lỗi trong iOS 7 và cũng được thảo luận trong Diễn đàn nhà phát triển của Apple.