2013-02-14 27 views
2

有了一个NSTableView我可以订阅NSTableViewColumnDidResizeNotification得到一个列的事件被调整:列大小调整完成后的NSTableView通知?

[[NSNotificationCenter defaultCenter] addObserver: self 
             selector: @selector(tableColumnsResized) 
              name: NSTableViewColumnDidResizeNotification 
              object: dataTableView]; 

不过,我希望只得到一个通知,一旦大小调整已经完成(这样我就可以节省一些细节)。如果我在每个通知中都运行代码,那么调整列大小会造成一些结局。这就是为什么我只想在调整大小完成时才会收到通知。

任何建议如何我可以做到这一点?

+0

根据文档:'NSTableViewColumnDidResizeNotification'应该已经做到了你想要的:“每当列在NSTableView对象中调整大小时发布”。 – trojanfoe 2013-02-14 12:49:19

+0

它目前发布每个移动像素的通知。我想只在完成时才会收到通知。 – Kyle 2013-02-14 12:50:53

+1

不知道2013年的情况如何,但是今天NSTableViewColumnDidResizeNotification只有在调整大小后才会触发。被接受的答案是可怕的btw ...即使在2013年每次鼠标拖动事件都错误地发送了通知,即使鼠标按钮没有被释放,接受的解决方案也会在鼠标停止移动0.5秒后计算出来,所以拖动还没有真正完成。 – 2016-01-27 00:04:26

回答

2

每当您收到调整大小通知时,您应该设置一个短计时器,取消任何以前的计时器。然后,您可以执行你在计时器最终行动解雇方法:

.H:

@interface MyClass : NSView 
{ 
    NSTimer *_columnResizeTimer; 
} 

@end 

.M:

// Private Methods 
@implementation MyClass() 

- (void)_columnResized:(NSTimer *)timer; 

@end 

@implementation MyClass 

- (void)dealloc 
{ 
    [_columnResizeTimer invalidate]; 
    _columnResizeTimer = nil; 

    // If using MRR: 
    [super dealloc]; 
} 

- (void)tableViewColumnDidResize:(NSNotification *)notification 
{ 
    [_columnResizeTimer invalidate]; 
    _columnResizeTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 
                  target:self 
                 selector:@selector(_columnResized:) 
                 userInfo:nil 
                 repeats:NO]; 
} 

- (void)_columnResized:(NSTimer *)timer 
{ 
    [_columnResizeTimer invalidate]; 
    _columnResizeTimer = nil; 

    // Do stuff on column resize 
} 

@end 

(此代码是未经测试并可能越野车)。

+1

谢谢@trojanfoe。这应该很好。为了看看还有什么其他的选择,我会留下这个问题没有回答几天,因为它看起来有点冒险,但否则我会选择这个! – Kyle 2013-02-14 14:01:53

+1

@Zenox我同意;这很可怕,但似乎是推迟一次处理快速事件的常用机制。 – trojanfoe 2013-02-14 14:02:55

相关问题