NSTextField在NSTableCellView中 - 在失去焦点时结束编辑

时间:2014-12-05 18:59:43

标签: macos cocoa nstableview nstextfield nscontrol

我有一个基于视图的NSTableView(它本身有一个带有单个文本字段的单元格视图)以及tableview外部的一些按钮和文本字段的视图。其中一个按钮将一个对象添加到tableview的数据源中,并在将该行插入tableview后立即使其可编辑。

如果用户输入文本并按下返回键,我会收到- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor委托方法,我可以运行验证并保存值。但是,如果用户选择tableview之外的任何其他按钮或文本字段,则不会调用该委托。

在NSTableCellView内的文本字段中检测这种失去焦点的最佳方法是什么,所以我可以在tableview条目上运行我的一些验证代码?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望在以下情况下发出control:textShouldEndEditing:通知:

  1. 您将新对象添加到阵列控制器。
  2. 自动选择表中对象的行。
  3. 您以编程方式选择相关行中的文本字段进行编辑。
  4. 用户立即(即不在文本字段中进行任何编辑)将焦点放在UI中其他位置的控件上
  5. 我过去使用的一种方法是,在文本字段可供用户编辑之前,对与文本字段关联的字段编辑器进行无关紧要的编程更改。下面的代码段显示了如何执行此操作 - 在上面的方案中,这是第2步 / 第3步

    func tableViewSelectionDidChange(notification: NSNotification) {
        if justAddedToArrayController == true {
            // This change of selection is occurring because the user has added a new
            // object to the array controller, and it has been automatically selected 
            // in the table view. Now need to give focus to the text field in the 
            // newly selected row...
    
            // Access the cell
            var cell = tableView.viewAtColumn(0,
                row: arrayController.selectionIndex,
                makeIfNecessary: true) as NSTableCellView
    
            // Make the text field associated with the cell the first responder (i.e. 
            // give it focus)
            window.makeFirstResponder(cell.textField!)
    
            // Access, then 'nudge' the field editor - make it think it's already
            // been edited so that it'll fire 'should' messages even if the user 
            // doesn't add anything to the text field
            var fe = tableView.window?.fieldEditor(true, forObject: cell.textField!)
            fe!.insertText(cell.textField!.stringValue)
        }
    }