2013-07-14 25 views
2

我有一个两列的NSOutlineView(基于视图)。在第二列中,我有一个连接到一个NSPopOver的NSButton。NSOutlineView reloadData关闭我的NSPopOver

当我点击按钮时,它会按预期显示NSPopOver =>弹出窗口是可见的。

问题:如果我重新加载NSOutlineView的数据,它会隐藏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视图,并将NSMouseLocation用于popover的位置。

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上大纲视图大纲视图删除所有它的子视图(包括所述酥料饼附着到的按钮)的并重新创建它们。当按钮从其超级视图中移除时,弹出窗口关闭。

你真的需要重新加载所有的大纲视图数据吗?您可以使用-reloadDataForRowIndexes重新加载特定的行:columnIndexes:或-reloadItem:?

或者,您可以尝试传递大纲视图本身,而不是将按钮(发件人)传递给-showRelativeToRect:ofView:preferredEdge:m。