gpt4 book ai didi

objective-c - Cocoa:NSPanel 失去父级和其他奇怪的行为

转载 作者:行者123 更新时间:2023-12-03 16:32:38 24 4
gpt4 key购买 nike

我遇到了 NSPanel 行为异常的问题,并创建了一个 Sample App来演示这种行为。

该应用程序是根据 Xcode 4 的模板生成的,只需创建一个面板,然后根据按下的按钮打开和关闭它:

enter image description here

我观察到的奇怪行为:

  1. 在 Lion 下,第一次打开面板后,面板会跟随主窗口移动,这是正确的行为。但是,关闭并重新打开它后,它不再跟随主窗口。
  2. 在 Snow Leopard 下,关闭面板时主窗口也会关闭!

编辑:只是为了清楚起见;我期望的行为是当主窗口移动时,面板跟随主窗口;并且在面板关闭并随后重新打开后也是如此。另外,我预计面板和主窗口在 Snow Leopard 和 Lion 下的行为方式相同。

代码的重要部分在这里:

@implementation MyAppDelegate

- (void)dealloc
{
[_panel release];
[super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
_panel = [[NSPanel alloc]
initWithContentRect:NSMakeRect(400, 400, 200, 100)
styleMask:NSUtilityWindowMask|NSClosableWindowMask|NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:YES];
[_panel setTitle:@"A Panel"];
}

- (IBAction)openPanel:(id)sender
{
[_panel setParentWindow:[self window]];
[_panel makeKeyAndOrderFront:sender];
}

- (IBAction)closePanel:(id)sender
{
[_panel orderOut:sender];
}

@end

注意:我向 openPanel 方法添加了不必要的 setParentWindow 调用,以断言每次打开面板时都会重置父窗口;但这没有什么区别。

有人可以解释一下我做错了什么吗?

编辑:对于实现文件中缺少的 @synthesize window = _window 存在一些混淆,但我刚刚打开了我创建的另一个项目示例来测试内存泄漏行为,它也不在那里。我使用的是 Xcode 4.4,因此这可能是一个错误,但我不认为项目模板已更改。

最佳答案

您不应该从子级设置父子关系,而是从父级设置。 setParentWindow:文档说:

This method should be called from a subclass when it is overridden by a subclass’s implementation. It should not be called otherwise.

相反,请使用 addChildWindow:ordered: ,像这样:

- (IBAction)openPanel:(id)sender
{
[[self window] addChildWindow:_panel ordered:NSWindowAbove];
//[_panel setParentWindow:[self window]];
[_panel makeKeyAndOrderFront:sender];
}

我没有在 Snow Leopard 下对此进行测试,但它修复了我在 Lion 上运行时的行为。

Rob Keniger 在下面指出,在 Snow Leopard 上,您还应该在订购面板之前执行 [[self window]removeChildWindow:_panel] 操作。 (我认为这对于 Lion 来说也是一个好主意。)

关于objective-c - Cocoa:NSPanel 失去父级和其他奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10375864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com