【问题标题】:NStableView CocoaNStableView 可可
【发布时间】:2012-11-20 12:24:48
【问题描述】:

我用 tableView 控制器填充了我的NStableView,它工作正常。我只想知道为什么每当用户将鼠标悬停在表格视图中的特定单元格上时,每次我获取数据(在表格单元格中呈现)时,它就会开始在控制台中显示数据。

我发现这个- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 每次都会调用,我使用仪器进行堆栈跟踪,这种方法占用了大量内存。

有什么办法可以阻止这个方法每次都绘制数据。

【问题讨论】:

  • 只需维护一个标志,用于观察何时手动刷新表格视图
  • 如何以编程方式检查用户是否将鼠标悬停在 NSTableView 上?每当我将 curosr 放在 tableView 上时,每次都会调用 dataCellForTableColumn。
  • 你现在开始工作了吗?

标签: macos cocoa nstableview nstableviewcell


【解决方案1】:

将委托 -viewWillMoveToWindow 添加到包含表的视图子类。这里我使用了名为reloadTableBOOLNSTrackingArea 是您问题的答案

- (void) viewWillMoveToWindow:(NSWindow *)newWindow
{
    // Setup a new tracking area when the view is added to the window.
    NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[yourTable frame]
                options: (NSTrackingMouseEnteredAndExited |  
                NSTrackingActiveAlways|NSTrackingEnabledDuringMouseDrag) owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];

}

- (void) mouseEntered:(NSEvent*)theEvent {
    reloadTable=YES;
    NSLog(@"enter %@",theEvent);

}

- (void) mouseExited:(NSEvent*)theEvent {

     reloadTable=YES;

}

然后在您的 NSTableViewDataSource 方法中使用它

【讨论】:

  • 我在 [self addTrackingArea:trackingArea] 中遇到错误;我应该使用 [tableView addTrackingArea:trackingArea]; ?
  • viewWillMoveToWindow 没有调用,我使用 NSViewController 来显示视图。
  • 对不起兄弟 viewWillMoveToWindow 是一个 NSView 方法以上所有方法都必须在 NSView 子类中实现
  • 在 NSWindow 中添加 NSViewController 是不是错误的做法 - (void)setController:(NSViewController )controller { [[currentController view] removeFromSuperview]; NSView *view = [控制器视图]; view.frame = ((NSView)self.window.contentView).bounds; [_window setContentView:view]; //[_window.contentView addSubview:view]; }
  • 不,不是。你可以使用 NSWindowController 或 NSViewController ,无论哪种方式你都可以实现视图之间的导航
猜你喜欢
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多