基于视图的NSTableView接收延迟编辑操作

时间:2012-08-06 06:20:41

标签: cocoa nstableview

每当用户点击单元格并等待或双击它时,我想从基于视图的表格单元格中显示弹出窗口。双击部分很容易,双击动作,但我找不到点击等待的方法。我可以选择表格,但我希望它类似于文本字段(它不会立即开始编辑)或Xcode中的对象库。

2 个答案:

答案 0 :(得分:0)

您可以实现表视图委托方法tableViewSelectionDidChange:,并在该方法中调用performSelector:withObject:afterDelay:在显示弹出窗口之前添加所需的任何延迟。

答案 1 :(得分:0)

本文档描述了如何在文本字段编辑开始/结束时收到通知。

这些是实现处理它们的基本委托方法。

func control(control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
    return  true
}
func control(control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
    return  true
}

说明

我相信你会说'#34;延迟编辑"比如在Finder中重命名。 用户单击一个条目,等待一点,很快就可以编辑。

我终于弄清楚这是如何运作的。 "延迟编辑"更有可能是双重动作(setDoubleAction:)的副作用,而不是形式特征。因为您有双击操作,所以表视图必须等待双击间隔以确定第二次单击是否会发生。

如果您不是setDoubleAction:,则会立即在文本字段中开始编辑。但是通过设置双重动作,我们可以使其延迟。其余的工作只是在编辑开始时得到通知。

以上代码都是为了这个。我检查过这是在OS X 10.10上工作。 NSButton似乎确实被推迟了。我希望这会有所帮助。

另一种解决方案

如果上述方法不起作用,这是另一种方法。

  • 准备NSTextField子类。

    @interface  AAATextField: NSTextField
    @end
    @implementation AAATextField
    - (BOOL)becomeFirstResponder {
        NSLog(@"%@", @"editing is starting...");
        return  YES;
    }
    @end
    
  • 准备NSTableCellView子类。

    @interface BBBTableCellView : NSTableCellView
    @property(nonatomic,readwrite,strong) NSTextField*  exampleTextField;
    @end
    
    @implementation BBBTableCellView
    @synthesize exampleTextField;
    - (instancetype)initWithFrame:(NSRect)frameRect {
        self    =   [super initWithFrame:frameRect];
        if (self) {
            exampleTextField    =   [[AAATextField alloc] initWithFrame:CGRectMake(20, 0, 100, 20)];
            [self addSubview:exampleTextField];
            [self setTextField:exampleTextField];
        }
        return  self;
    }
    @end
    
  • NStableView一起使用。

    - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
        BBBTableCellView*   v   =   [[BBBTableCellView alloc] init];
        v.exampleTextField.stringValue  =   @"ABCDE";
        return v;
    }