4 cocoa nswindow nswindowcontroller
我在代理应用程序中使用NSMenu (在Dock中没有图标).点击此菜单中的按钮时,我想显示一个通用的NSWindowController.
我的菜单按钮动作:
- (IBAction)menuButtonTapped:(id)sender {
MyWindowController *myWindow = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];
[myWindow showWindow:nil];
[[myWindow window] makeMainWindow];
}
Run Code Online (Sandbox Code Playgroud)
但窗口只是在屏幕上"闪烁"(它显示并消失得非常快).
有解决方案吗
窗口显示一瞬间然后消失的原因与ARC有关,以及如何创建窗口控制器的实例:
- (IBAction)menuButtonTapped:(id)sender {
MyWindowController *myWindow = [[MyWindowController alloc]
initWithWindowNibName:@"MyWindowController"];
[myWindow showWindow:nil];
[[myWindow window] makeMainWindow];
}
Run Code Online (Sandbox Code Playgroud)
在ARC下,myWindow实例将对定义它的范围有效.换句话说,在[[myWindow window] makeMainWindow];到达并运行最后一行之后,将释放并释放窗口控制器,结果,其窗口将从屏幕中移除.
一般来说,对于您想要"粘贴"的项目或对象,您应该将它们定义为具有strong属性的实例变量.
例如,你的.h看起来像这样:
@class MyWindowController;
@interface MDAppController : NSObject
@property (nonatomic, strong) MyWindowController *windowController;
@end
Run Code Online (Sandbox Code Playgroud)
修改后的menuButtonTapped:方法看起来像这样:
- (IBAction)menuButtonTapped:(id)sender {
if (self.windowController == nil) {
self.windowController = [[MyWindowController alloc]
initWithWindowNibName:@"MyWindowController"];
}
[self.windowController showWindow:nil];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2687 次 |
| 最近记录: |