我目前正在为可可的SketchApp插件。
我尝试在此处使用NSPopover
,单击按钮时应由IBAction
触发。问题是:弹出窗口没有显示,并且在检查应该容纳弹出窗口的变量时,它是nil
。
我在界面生成器中创建了NSPopover
,所以不是以编程方式在代码中创建的;然后在链接的类头文件中定义一个IBOutlet
绑定;最后在我的实现类中使用此变量。
这是我的源代码:
MyComponent.h
// imports skipped...
@interface
@property (nonatomic, weak) IBOutlet NSTextField *componentDescription;
@property (nonatomic, weak) IBOutlet NSTextField *componentGuid;
@property (nonatomic, weak) IBOutlet NSButton *guidCopyButton;
@property (nonatomic, weak) IBOutlet NSPopover *popover;
-(IBAction)onCopyButton_Clicked:(id)sender;
@end
MyComponent.m
-(IBAction)onCopyButton_Clicked:(id)sender {
// copy stuff to clipboard
// [...]
// show copied popover
[_popover showRelativeToRect:[sender bounds]
ofView:sender
preferredEdge:NSMinYEdge];
}
在我的xib
视图文件中,我将NSPopover对象链接到IBOutlet NSPopover *popover;
。但是在我的类实现中检查_popover
时,它始终是nil
。
答案 0 :(得分:1)
好吧,经过一周的讨论,我想我终于明白了出了什么问题。将存储模式从@property (nonatomic, weak) NSPopover *popover;
更改为... (nonatomic, strong) ...;
后,该实例不再是nil
。
我认为与NSButton
(例如)的区别在于,按钮在xib模板中被使用,因此按钮的引用没有被清除。但是,Popover并非直接“使用”,因此在实际使用前可能会被清理。因此,将其从weak
更改为strong
似乎是这里的重点。
但是:这个调整是否会带来意想不到的/意外的副作用?我现在是否必须为弹出窗口独自照顾破坏?