2017-04-12 2 views
0

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; 

} 사용

+0

에 NO 때도 사용이 상황을 옴하지 NSPopOver 대표 '- (BOOL) popoverShouldClose : (NSPopover *) 팝 오버,' '- (무효) popoverWillClose : (NSNotification *) 통지 ; –

+0

나는이 점도 생각했다. 그러나이 솔루션은 또한 popover (나는 허용하고 싶다 - 그리고 popover를 닫아야한다) 옆의 클릭 수를 추적 할 것이다. 그것은 Popover CLOSING이 아닙니다 ... 그것은 openDialog가 완료 될 때까지 피하고 싶은 viewController의 DEALLOCATING입니다. –

+1

openDialog가 열려있을 때 bool 변수를 사용하면 popoverShouldClose –

답변

1

bool 변수. openDialog가 열려 반환 - (BOOL)popoverShouldClose:(NSPopover *)popover;

관련 문제