2013-07-14 5 views
2

두 개의 열이있는 NSOutlineView (보기 기반)가 있습니다. 두 번째 열에는 NSButton이 하나의 NSPopOver에 연결되어 있습니다.NSOutlineView reloadData 내 NSPopOver 닫기

버튼을 클릭하면 NSPopOver가 예상대로 표시됩니다.> Popover가 표시됩니다.

문제 : NSOutlineView의 reloadData가 NSPopover를 숨기는 경우!

정상적인 동작입니까? 이것을 피하는 방법? 다른 단어에서

이 popoverWillClose 위임 메시지가 이후에 호출 될 때마다 reloadData

//OMN_Object.m 
#pragma mark - Actions 
- (IBAction)togglePopover:(id)sender 
{ 
    ... 
    Call App_delegate togglePopover:withTextLog:withTextInputFileDetails:withTextOutputFileDetails:fromObject: 

//App_delegate.m 
... 
[self.myPopOver setDelegate:self]; 
... 
#pragma mark Popover delegate 

- (void)popoverWillClose:(NSNotification *)notification 
{ 
    NSLog(@"%s *** popoverWillClose %@",__PRETTY_FUNCTION__, self.myPopOver); 
} 

-(void)togglePopover:(id)sender withTextLog:(NSString*)textLog 
withTextInputFileDetails:(NSString*) textInfoInput 
withTextOutputFileDetails:(NSString*) textInfoOutput 
       fromObject:(id)object 
{ 
    id v = [[self.myPopOver contentViewController] view] ; 

    NSTextView *t1 = [v textViewLog]; 
    [t1 setString:textLog]; 

    NSTextView *t2 = [v textViewInputFileDetails]; 
    [t2 setString:textInfoInput]; 

    NSTextView *t3 = [v textViewOutputFileDetailsLastPassFileOnly]; 
    [t3 setString:textInfoOutput]; 

    if (self.myPopOver.isShown == 0) { 
     NSLog(@"%s Displaying popover %@", __PRETTY_FUNCTION__, self.myPopOver); 
     [self.myPopOver showRelativeToRect:[sender bounds] 
            ofView:sender 
          preferredEdge:NSMaxYEdge]; 
     self.objectOwnerOfPopOver = object; 
    } 
    else { 
     NSLog(@"%s Closing popover %@", __PRETTY_FUNCTION__, self.myPopOver); 
     [self.myPopOver close]; 
     self.objectOwnerOfPopOver = nil; 
    } 
} 

// Outline_view_delegate.m 
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item{ 
... 
    else if ([[tableColumn identifier] isEqualToString:@"Status"]){ 
     if ([item isKindOfClass:[OMN_Object class]]) 
     { 
      OMN_Object *o = item; 

      ObjectStatusTableCellView *v = [outlineView makeViewWithIdentifier:@"StatusCell" owner:self]; 
        .... 

      [v.buttonRevealInFinder setAction:@selector(buttonRevealInFinderClicked:)]; 
      [v.buttonRevealInFinder setTarget:o]; 

      [v.buttonInfo setTarget:o]; 
      [v.buttonInfo setAction:@selector(togglePopover:)]; 

      return v; 
     } 
... 
} 
+0

내가 볼 내일 노력할 것 [[알림 사용자 정보] 을 objectForKey : NSPopoverCloseReasonKey] – Elfoiros

답변

0

해결. popover를 NSWindow 뷰에 첨부하고 Popover의 위치에 NSMouseLocation을 사용했습니다.

NSPoint mouseLoc2 = [self.window mouseLocationOutsideOfEventStream]; 
NSRect r4 = NSMakeRect(mouseLoc2.x -10, mouseLoc2.y -10, 16, 16); 
[self.myPopOver showRelativeToRect:r4 
          ofView:self.window.contentView 
        preferredEdge:NSMaxYEdge]; 
2

당신은 개요보기합니다 (팝 오버가 연결된 버튼 포함) 파단을 모두 제거 볼 윤곽에 reloadData를 호출 할 때 그들을 다시 만듭니다. 슈퍼 뷰에서 버튼을 제거하면 popover가 닫힙니다.

개요보기 데이터를 모두 다시로드해야합니까? -reloadDataForRowIndexes를 사용하여 특정 행을 다시로드 할 수 있습니까? columnIndexes : 또는 -reloadItem :?

또는 단추 (보낸 사람)를 -showRelativeToRect : ofView : preferredEdge : m에 전달하는 대신 개요보기 자체를 전달할 수도 있습니다.