2013-07-14 3 views
2

У меня есть NSOutlineView (View based) с двумя столбцами. Во втором столбце у меня есть NSButton, подключенный к одному NSPopOver.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

Я попробую завтра, чтобы увидеть [[уведомление USERINFO] 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 по контуру просмотра контурный вид удаляет все его подвидов (в том числе кнопки, что поповер прикреплен к) и воссоздает их. Когда кнопка удаляется из своего супервизора, popover закрывается.

Действительно ли вам необходимо перезагрузить все данные вида схемы? Не могли бы вы перезагрузить определенные строки вместо использования -reloadDataForRowIndexes: columnIndexes: или -reloadItem :?

В качестве альтернативы вместо передачи кнопки (отправителя) в -showRelativeToRect: ofView: preferredEdge: m вы можете попробовать пропустить представление схемы.

 Смежные вопросы

  • Нет связанных вопросов^_^