Gần đây tôi đã gặp phải một tình huống tóc kéo trong ứng dụng iOS của tôi, nơi tôi đang cố gắng liên tục sa thải một giới UIViewController
từ rootViewController cửa sổ của tôi, sử dụng:cuộc gọi kế tiếp phương pháp presentViewController UIViewController của
[rootViewController dismissViewControllerAnimated:YES completion:NULL]
và trình bày nhau ngay sau đó (theo phương pháp khác, tình cờ), với:
UIViewController *vc2 = [[[MyViewController2 alloc] initWithNibName:nil bundle:nil] autorelease];
[rootViewController presentViewController:vc2 animated:YES completion:NULL];
Vấn đề là, tôi không bao giờ có thể xem bộ điều khiển thứ hai hiển thị. Hóa ra, gần như tôi có thể nói, dismissViewControllerAnimated:completion:
cần khối không đồng bộ "hoàn thành" thời gian để vượt qua, trước khi presentViewController:animated:completion:
sẽ hoạt động bình thường trở lại. Thực tế này không được ghi chép trực tiếp trong Apple's docs, từ những gì tôi có thể nói.
Các giải pháp tôi đưa ra là để quấn sa thải với một phương pháp chỉ định chọn bạn sẽ muốn gọi sau đó, như vậy:
- (void)dismissViewController:(UIViewController *)presentingController
postAction:(SEL)postDismissalAction
{
[presentingController dismissViewControllerAnimated:YES
completion:^{
[self performSelectorOnMainThread:postDismissalAction
withObject:nil
waitUntilDone:NO];
}];
}
Và sau đó tôi sẽ gọi:
[self dismissViewController:self.window.rootViewController
postAction:@selector(methodForNextModalPresentation)];
Dù sao, tôi muốn đăng bài, khi tôi nhìn xung quanh và không thấy ai có vấn đề cụ thể này, vì vậy tôi nghĩ rằng nó có thể hữu ích cho mọi người hiểu. Và ngoài ra, tôi muốn xác minh rằng tôi không hack một giải pháp có mẫu thiết kế tốt hơn để giải quyết.
Tôi tin rằng mã nên hoạt động. Ví dụ của tôi đã được sử dụng presentViewController như cuộc gọi tiếp theo, nhưng tôi sẽ giả sử bạn sẽ gặp phải cùng một vấn đề với mã của bạn nếu, thay vì thực hiện hành động trong khối hoàn thành, bạn đã làm: '[myRootViewController dismissViewControllerAnimated: YES completion: NULL ]; [myRootViewController pushViewController: newController động: YES]; ' – KevinH