NSPopover 在 macOS Sonoma 上不显示内容

NSPopover not showing content on macOS Sonoma

提问人:pcholka 提问时间:9/28/2023 更新时间:9/28/2023 访问量:146

问:

我遇到了一个奇怪的问题,即 NSPopover 不显示内容。同样奇怪的是,在 Xcode Debug View Hierarchy 中检查视图时,它会按预期呈现所有视图。

(https://i.stack.imgur.com/Ewa81.png)

以下是 Xcode 调试视图层次结构的样子: (https://i.stack.imgur.com/rL5a4.png)

我只是不明白这个问题;为什么 LoginViewController 的视图不显示。此问题始于 macOS Sonoma。

以下是 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];
}

以下是 Popover 的 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)]|"];
}
Swift macOS Cocoa AppKit

评论


答:

0赞 wwwrodia 9/28/2023 #1

对于 macOS,Sonoma AppKit 对 NSView 的绘图行为进行了更改。现在,视图的绘制不受其边界的限制。

添加子控制器的视图时,请尝试将 .默认情况下,在 macOS Sonoma 上,它是 false。clipsToBounds = true

此外,请尝试为所有自定义视图进行设置。clipsToBounds = true