You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS Sonoma下NSPopover不显示内容的问题求助

macOS Sonoma下NSPopover内容不显示排查方案

问题现象

升级到macOS Sonoma后,NSPopover无法显示LoginViewController的内容,但通过Xcode视图层级调试工具可以看到所有视图都已正常渲染。

相关代码

Popover设置代码

{
    _popover = NSPopover.new;
    _popover.animates = NO;
    _popover.behavior = NSPopoverBehaviorApplicationDefined;

    NSViewController* vc;
    if (user == nil)
    {
        vc = LoginViewController.new;
    }
    else
    {
        vc = MessageViewController.new;
    }
    _popover.contentViewController = [RootViewController.alloc initWithRootViewController:vc];
    [_popover.contentViewController loadView];
    _statusItem = [NSStatusBar.systemStatusBar statusItemWithLength:24];
    _statusItem.button.action = @selector(onPress);
    _statusItem.button.target = self;
    [self reloadPopoverTrayImageForce:YES];
}

RootViewController实现代码

{
    self.view = NSView.new;
    self.view.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addSubview:self.containerView];
    if (self.rootViewController)
    {
        [self addChildViewController:self.rootViewController];
        [self.containerView addSubview:self.rootViewController.view];
        self.rootViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
        id r = @{ @"root": self.rootViewController.view };
        [self.containerView addFor:r constraints:@"|[root]|"];
        [self.containerView addFor:r constraints:@"V:|[root]|"];
    }
    [self.view addSubview:self.footerView];
    [self reloadConstraints];

    id v = @{
            @"container": self.containerView,
            @"footer": self.footerView
    };

    [self.view addConstraint:[NSLayoutConstraint
            constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual
                        toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:WIDTH]];
    [self.view addConstraint:[NSLayoutConstraint
            constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual
                        toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:HEIGHT]];

    [self.view addFor:v constraints:@"|[container]|"];
    [self.view addFor:v constraints:@"|[footer]|"];
    [self.view addFor:v constraints:@"V:|[container]-0-[footer(44)]|"];
}

排查方向与修复建议

  • 移除手动调用的loadView
    macOS Sonoma对NSViewController的视图加载生命周期做了调整,手动调用[_popover.contentViewController loadView]可能导致视图布局未正确关联到popover的渲染流程,删除该行代码,让系统自动处理视图加载时机。

  • 检查containerView的初始化与约束
    确认self.containerView是否正确初始化并设置了translatesAutoresizingMaskIntoConstraints = NO,如果containerView本身没有有效约束,会导致子视图(LoginViewController的view)无法正常显示。

  • 显式设置Popover的contentSize
    在Sonoma中,popover可能依赖显式的contentSize确定弹窗大小,可在设置contentViewController后添加:

    _popover.contentSize = CGSizeMake(WIDTH, HEIGHT);
    

    替代直接给RootViewController的view设置固定宽高约束,避免潜在的约束冲突。

  • 检查子视图控制器生命周期方法
    确认LoginViewController的viewDidLoad、viewWillAppear等方法是否正常执行,排查是否有代码在这些方法中意外隐藏了视图。

内容的提问来源于stack exchange,提问作者pcholka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:08:13