2012-04-20 23 views
6

Tôi có một số mã để dọn sạch trong số viewWillDisappear:, mà tôi chỉ muốn sử dụng khi chế độ xem đang chuyển về bộ điều khiển chế độ xem gốc.isBeingDismissed không được đặt trong chế độ xemWillDisappear:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    if ([self isMovingFromParentViewController] || [self isBeingDismissed]) { 
     NSLog(@"isMovingFromParentViewController or isBeingDismissed"); 
     // clean up 
    } 
    [super viewWillDisappear:animated]; 
} 

Chế độ xem có thể được trình điều khiển điều hướng đẩy hoặc hiển thị dưới dạng bộ điều khiển chế độ xem (từ cùng một bộ điều khiển điều hướng). Nếu nó được đẩy, sau đó xuất hiện (nhấn nút quay lại), mã dọn dẹp của tôi sẽ chạy. Nếu nó được trình bày như một bộ điều khiển xem phương thức, sau đó bị loại bỏ, mã không chạy.

tôi sa thải như vậy:

[rootViewController dismissModalViewControllerAnimated:YES]; 

Câu hỏi của tôi là: tại sao không phải là isBeingDismissed bộ khi tôi bỏ điều khiển quan điểm của tôi?

Trả lời

3

Vấn đề của bạn là cách bạn loại bỏ chế độ xem phương thức của mình. RootViewController được định nghĩa như thế nào?

Khi tôi gọi [self dismissModalViewControllerAnimated:YES] thì [self isBeingDismissed] đánh giá là đúng.

Khi tôi gọi [parentViewController dismissModalViewControllerAnimated:YES] thì [self isBeingDismissed] đánh giá là đúng, theo đó parentViewController là UIViewController trình bày chế độ xem phương thức (lưu ý: không phải là UINavigationController).

+3

Tôi có thể khẳng định rằng 'isBeingDismissed() 'trả về' false' khi viewController được cho là xuất hiện từ một 'UINavigationController', chẳng hạn như viewController chi tiết trong một' UISplitViewController' đã thu gọn. – bio

16

Nếu đây là bộ điều khiển chế độ xem đầu tiên trong bộ điều khiển điều hướng phương thức bị loại bỏ, hãy gọi self.isBeingDimissed() từ viewWillDisappear: trả lại false.

Tuy nhiên, do toàn bộ trình điều khiển điều hướng bị loại bỏ, những gì thực sự hoạt động là self.navigationController?.isBeingDismissed(), trả về true.

0
 viewController.isBeingPresented == NO; 
     [rootVC presentViewController:viewController animated:NO completion:^{ 
      viewController.isBeingPresented == NO; 
      viewController.isBeingDismissed == NO; 
      [viewController dismissViewControllerAnimated:NO completion:^{ 
       viewController.isBeingDismissed == NO; 
      }]; 
      viewController.isBeingDismissed == NO; // is not work 
     }]; 
     viewController.isBeingPresented == YES;  // is work 
 viewController.isBeingPresented == NO; 
     [rootVC presentViewController:viewController animated:NO completion:^{ 
      viewController.isBeingPresented == NO; 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
       viewController.isBeingDismissed == NO; 
       [viewController dismissViewControllerAnimated:NO completion:^{ 
        viewController.isBeingDismissed == NO; 
       }]; 
       viewController.isBeingDismissed == YES; // is work 
      }); 
     }]; 
     viewController.isBeingPresented == YES;  // is work 
2

Như @Yuval Tal đã đề cập, cờ này không hoạt động khi bạn đang bác bỏ điều khiển được embeded bên trong điều khiển chuyển hướng. Đây là tiện ích mở rộng mà tôi sử dụng:

extension UIViewController 
{ 
    var isAboutToClose: Bool { 
     return self.isBeingDismissed ||  
       self.isMovingFromParentViewController ||   
       self.navigationController?.isBeingDismissed ?? false 
    } 
} 

Có thể dễ dàng mở rộng khi bạn tìm thấy trường hợp khác khi tiêu chuẩn .isBeingDismissed không hoạt động. Và nếu bạn tìm thấy, hãy cho chúng tôi, cho tôi biết trong phần bình luận.

0

Nếu bởi một số cơ hội bạn đến đây cố gắng sử dụng isBeingDismissed trên một bộ điều khiển xem phi modally trình bày, bạn luôn có thể kiểm tra topViewController tài sản của navigationController của bạn, ví dụ:

if navigationController?.topViewController != self { 
    return 
}