失去焦点时的NSPopover解除分配(OSX,Objective-C)

时间:2017-04-12 06:56:03

标签: objective-c delegates xcode8 nspopover

我在OSX(不是iOS),Xcode 8.2,启用ARC,Objective-C。

我有一个视图,在按钮点击时打开一个弹出窗口。两者都与委托和协议相关联,允许访问以下方法(以及其他方法)

- (id)valueForKey:(NSString*)key;
- (void)setValue:(id)value forKey:(NSString *)key;

(我经常使用这个协议,需要尽可能保持清洁和非特定)

在popover的视图中,有另一个按钮可打开NSOpenPanel。一旦面板打开,弹出窗口就会消失并被解除分配 - 这是首选的行为......通常。不幸的是,我需要openPanel通过协议方法保存到父视图。但是如果弹出窗口被取消分配,那么这些方法就不再可用了。

所以我尝试在openPanel之前创建一个对我要保存的值的强引用,然后释放它以保持popover viewController在内存中。但是一旦我试图释放它......它崩溃了。

@interface SHWildcardItemSettingImageViewController ()

    @property (strong) NSString* customImagePathBookmark;

@end


@implementation SHWildcardItemSettingImageViewController

     // Create strong reference to delegate (to not dealloc popoverViewController)
    [self setCustomImagePathBookmark:[_delegate valueForKey:@"customImagePathBookmark"]];

     // Setup open panel
    NSOpenPanel *openPanel = [[NSOpenPanel alloc] init];
    [openPanel setAllowsMultipleSelection:NO];
    [openPanel setCanChooseDirectories:YES];
    [openPanel setCanChooseFiles:NO];
    [openPanel setCanCreateDirectories:YES];
    [openPanel setPrompt:@"Choose folder"];

    // Display the dialog box.  If the OK pressed, process the folder.
    if ( [openPanel runModal] == NSModalResponseOK ) {

    // Gets list of all files selected
    NSArray *files = [openPanel URLs];

    // Create and save Bookmark for later use (_bookmarks is a custom NSObject)
    [_delegate setValue:[_bookmarks bookmarkFromURL:[files objectAtIndex:0]] forKey:@"customImagePathBookmark"];
}

    [self setCustomImagePathBookmark:nil]; // <---- Crashes here
@end

在NSOpenPanel聚焦时保持弹出窗口的最佳方法是什么,而不使用不同的NSPopoverBehaviours。

修改

有时你看不到它......感谢@Ron Gahlot   - 解决了简单的布尔检查:

- (BOOL)popoverShouldClose:(NSPopover *)popover
{
    // Check if imageSettings can close
    if ([popover.contentViewController isMemberOfClass:[SHWildcardItemSettingImageViewController class]])
        return ![[popover.contentViewController valueForKey:@"lockPopover"] boolValue];

return YES;

}

1 个答案:

答案 0 :(得分:0)

你使用bool变量。当openDialog打开时返回NO - (BOOL)popoverShouldClose:(NSPopover *)popover;