Ios 模态popover控制器从ViewDidDisplay显示时不显示其内容

Ios 模态popover控制器从ViewDidDisplay显示时不显示其内容,ios,objective-c,uikit,uipopovercontroller,Ios,Objective C,Uikit,Uipopovercontroller,我有一个视图控制器,它在另一个视图控制器上显示为模态。如果显示动画:否from viewdide,则在第二次显示时不会显示其内容。我已经缩小了这个问题:我添加了两个控制器,通过一个序列连接到故事板,每个控制器在ViewDidDisplay中呈现相同的popover控制器。 它们中的每一个都是同一类的实例: #import "ViewController.h" #import "PopupViewController.h" @interface ViewController () <UIP

我有一个视图控制器,它在另一个视图控制器上显示为模态。如果显示动画:否from viewdide,则在第二次显示时不会显示其内容。我已经缩小了这个问题:我添加了两个控制器,通过一个序列连接到故事板,每个控制器在ViewDidDisplay中呈现相同的popover控制器。 它们中的每一个都是同一类的实例:

#import "ViewController.h"
#import "PopupViewController.h"

@interface ViewController () <UIPopoverPresentationControllerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self showPopover];
}

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection {
    return UIModalPresentationNone;
}

- (void)showPopover {
    PopupViewController* popoverController = [[PopupViewController alloc] initWithNibName:NSStringFromClass([PopupViewController class]) bundle:nil];
    popoverController.modalPresentationStyle = UIModalPresentationPopover;
    popoverController.preferredContentSize = CGRectInset(self.view.bounds, 20, 100).size;
    popoverController.popoverPresentationController.sourceView = self.view;
    popoverController.popoverPresentationController.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds), 0, 0);
    popoverController.popoverPresentationController.permittedArrowDirections = 0;
    popoverController.popoverPresentationController.delegate = self;
    [self presentViewController:popoverController animated:NO completion:nil];
}

@end
popover在应用程序启动时正确显示,但在按下第二个视图控制器和点击后退按钮时为空。如果将“动画”更改为“是”,则会正确显示弹出框

编辑:如果我在Xcode中调试视图层次结构,则视图将正确显示,其所有帧都应为:

这是设备上的外观,左侧为正确的popover,右侧为空:

这个问题很容易复制。我开始记录事件,这似乎是由UINavigationController处理动画的方式造成的

为推送的控制器调用ViewDidDisplay时,动画尚未完成。通过检查UINavigationControllerDelegate中的navigationController:didShowViewController方法,您可以自己看到这一点

事件日志如下所示:

Navigation controller will show VC 1
VC 1 did layout subviews
VC 1 did layout subviews
VC 0 did move to parent <UINavigationController: 0x7feaf181ec00>
VC 1 did appear
VC 1 did move to parent <UINavigationController: 0x7feaf181ec00>
Navigation controller did show VC 1
这将使导航控制器完成其内部工作


请注意,在没有动画的情况下推送时不会出现问题,因此这可能是因为我们试图从另一个动画完成块显示没有动画的视图控制器,这意味着视图控制器层次结构事件的顺序被打破。添加dispatch_async会将代码从完成块中移出,一切都会正常工作。

当您按下第二个视图控制器时,popover会被删除吗,也许在ViewDidEnglish中?在进入第二个view控制器之前,我通过点击周围的阴影来关闭popover您是否在等待第一个popover消失?您的控制台中有任何警告吗?@Sulthan,没有警告,第一个popover完全消失。我已经复制了您的问题,我仍在试图找到这种行为的原因。可以通过在显示popover之前使用dispatch_添加一个小延迟来解决该问题,因此它可能与视图控制器层次结构中的某些问题有关。我在使用爆米花方面有很糟糕的经验。他们在很多情况下都表现得很奇怪。非常感谢,这似乎解决了问题。
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self showPopover];
    });
}