失去焦点时 NSPopover 释放 (OSX, Objective-C)
NSPopover deallocation when losing focus (OSX, Objective-C)
我在 OSX(不是 iOS),Xcode 8.2,启用 ARC,Objective-C。
我有一个视图,可以在单击按钮时打开一个弹出窗口。两者都与委托和允许访问以下方法(以及其他方法)的协议连接
- (id)valueForKey:(NSString*)key;
- (void)setValue:(id)value forKey:(NSString *)key;
(我经常使用这个协议,需要尽可能保持它的干净和不具体)
在弹出窗口的视图中,还有另一个用于打开 NSOpenPanel 的按钮。一旦面板打开,弹出窗口就会消失并被释放——这是首选行为……通常。不幸的是,我需要 openPanel 通过协议方法保存到父视图。但是,如果弹出窗口被释放,这些方法将不再可用。
所以我尝试在 openPanel 之前创建对我要保存的值的强引用,然后释放它以将弹出窗口 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
在不使用不同的 NSPopoverBehaviours 的情况下,在 NSOpenPanel 处于焦点时保持弹出窗口分配的最佳方法是什么。
编辑:
有时你看不到它......感谢@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;
}
你使用了布尔变量。当 openDialog 打开时 return NO in
- (BOOL)popoverShouldClose:(NSPopover *)popover;
我在 OSX(不是 iOS),Xcode 8.2,启用 ARC,Objective-C。
我有一个视图,可以在单击按钮时打开一个弹出窗口。两者都与委托和允许访问以下方法(以及其他方法)的协议连接
- (id)valueForKey:(NSString*)key;
- (void)setValue:(id)value forKey:(NSString *)key;
(我经常使用这个协议,需要尽可能保持它的干净和不具体)
在弹出窗口的视图中,还有另一个用于打开 NSOpenPanel 的按钮。一旦面板打开,弹出窗口就会消失并被释放——这是首选行为……通常。不幸的是,我需要 openPanel 通过协议方法保存到父视图。但是,如果弹出窗口被释放,这些方法将不再可用。
所以我尝试在 openPanel 之前创建对我要保存的值的强引用,然后释放它以将弹出窗口 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
在不使用不同的 NSPopoverBehaviours 的情况下,在 NSOpenPanel 处于焦点时保持弹出窗口分配的最佳方法是什么。
编辑:
有时你看不到它......感谢@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;
}
你使用了布尔变量。当 openDialog 打开时 return NO in
- (BOOL)popoverShouldClose:(NSPopover *)popover;