Unwind segue doesn't dismiss adaptive popover presentation when not modal

前端 未结 4 1018

Update for iOS 9 beta: Apple may have fixed this for iOS 9. If you work(ed) around this issue for iOS 8, make sure it also works correctly on iOS 9.

In

4条回答
  •  长情又很酷
    2021-02-06 12:45

    If you segue as a popover from a view controller embedded in a navigation controller, the corresponding unwind fails to dismiss the popover.

    It's a bug in -[UINavigationController segueForUnwindingToViewController:fromViewController:identifier]. The embedding navigation controller is supposed to supply a segue that will dismiss the popover but it doesn't. The fix then is to override this and supply a working segue, which we can get from the embedded view controller.

    Here's a partial solution that will only handle unwinding to the top view controller of the navigation stack:

    @implementation MyNavigationController
    
    - (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController
                                          fromViewController:(UIViewController *)fromViewController
                                                  identifier:(NSString *)identifier
    {
      if (toViewController == self.topViewController && fromViewController.presentingViewController == self)
        return [toViewController segueForUnwindingToViewController:toViewController
                                                fromViewController:fromViewController
                                                        identifier:identifier];
      else
        return [super segueForUnwindingToViewController:toViewController
                                     fromViewController:fromViewController
                                             identifier:identifier];
    }
    
    @end
    

    It works on iOS 8 for both landscape/portrait iPad and landscape/portrait iPhone. The logic should be robust enough to survive on iOS 9.

提交回复
热议问题