我有一个基于视图的NSTableView(它本身有一个带有单个文本字段的单元格视图)以及tableview外部的一些按钮和文本字段的视图。其中一个按钮将一个对象添加到tableview的数据源中,并在将该行插入tableview后立即使其可编辑。
如果用户输入文本并按下返回键,我会收到- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor
委托方法,我可以运行验证并保存值。但是,如果用户选择tableview之外的任何其他按钮或文本字段,则不会调用该委托。
在NSTableCellView内的文本字段中检测这种失去焦点的最佳方法是什么,所以我可以在tableview条目上运行我的一些验证代码?
答案 0 :(得分:2)
如果我理解正确,您希望在以下情况下发出control:textShouldEndEditing:
通知:
我过去使用的一种方法是,在文本字段可供用户编辑之前,对与文本字段关联的字段编辑器进行无关紧要的编程更改。下面的代码段显示了如何执行此操作 - 在上面的方案中,这是第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)
}
}