2012-05-17 26 views
7

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.

Trả lời

2

Chỉ vì mục đích rõ ràng. bạn đang nói rằng mã này không hoạt động?

[myRootViewController dismissViewControllerAnimated:YES completion:^{ 
    [myRootViewController pushViewController:newController animated:YES]; 
}]; 
+0

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

Các vấn đề liên quan