0

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

4

2 回答 2

0

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

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

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

解释

我相信您说的是“延迟编辑”之类的东西,例如在 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;
    }
    
于 2015-01-11T12:27:33.457 回答
0

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

于 2012-08-06T06:35:02.890 回答