Objective-C:Popover似乎总是无效

时间:2018-07-27 16:00:44

标签: objective-c cocoa sketchapp-plugin

我目前正在为可可的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

1 个答案:

答案 0 :(得分:1)

好吧,经过一周的讨论,我想我终于明白了出了什么问题。将存储模式从@property (nonatomic, weak) NSPopover *popover;更改为... (nonatomic, strong) ...;后,该实例不再是nil

我认为与NSButton(例如)的区别在于,按钮在xib模板中被使用,因此按钮的引用没有被清除。但是,Popover并非直接“使用”,因此在实际使用前可能会被清理。因此,将其从weak更改为strong似乎是这里的重点。

但是:这个调整是否会带来意想不到的/意外的副作用?我现在是否必须为弹出窗口独自照顾破坏?