OSX (iOS 아님), Xcode 8.2, ARC 사용, Objective-C에 있습니다.포커스를 잃을 때 NSPopover 할당 해제 (OSX, Objective-C)
버튼 클릭시 팝업을 여는보기가 있습니다. 모두 위임하고 (다른 사람의 사이에서) 다음과 같은 방법으로 액세스 할 수있는 프로토콜
- (id)valueForKey:(NSString*)key;
- (void)setValue:(id)value forKey:(NSString *)key;
(나는 자주이 프로토콜을 사용하여 가능한 한 깨끗하고 불특정 유지해야하는거야)
연결되어popover의 뷰에는 NSOpenPanel을 여는 또 다른 버튼이 있습니다. 패널이 열리면 popover가 사라지고 할당이 취소됩니다. 이는 일반적으로 기본 동작입니다 ... 일반적으로. 불행히도 프로토콜 방법을 통해 부모보기에 저장하려면 openPanel이 필요합니다. 그러나 Popover가 할당 해제되면 해당 메소드는 더 이상 사용할 수 없습니다.
그래서 나는 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;
} 사용
에 NO 때도 사용이 상황을 옴하지 NSPopOver 대표 '- (BOOL) popoverShouldClose : (NSPopover *) 팝 오버,' '- (무효) popoverWillClose : (NSNotification *) 통지 ; –
나는이 점도 생각했다. 그러나이 솔루션은 또한 popover (나는 허용하고 싶다 - 그리고 popover를 닫아야한다) 옆의 클릭 수를 추적 할 것이다. 그것은 Popover CLOSING이 아닙니다 ... 그것은 openDialog가 완료 될 때까지 피하고 싶은 viewController의 DEALLOCATING입니다. –
openDialog가 열려있을 때 bool 변수를 사용하면 popoverShouldClose –