2014-12-05 5 views
3

У меня есть представление с основанным на представлении NSTableView (который сам имеет вид ячейки с одним текстовым полем) и некоторые кнопки и текстовые поля вне таблицы. Одна из кнопок добавляет объект в источник данных для представления таблицы, а после вставки строки в представление таблицы немедленно делает его доступным для редактирования.NSTextField в NSTableCellView - редактирование конца при потере фокуса

Если пользователь вводит текст и нажимает клавишу возврата, я получаю метод делегата - (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor, и я могу запустить мою проверку и сохранить значение. Но делегат не вызывается, если пользователь выбирает любую из других кнопок или текстовых полей вне таблицы.

Каков наилучший способ обнаружить эту потерю фокуса в текстовом поле внутри NSTableCellView, поэтому я могу запустить некоторый мой код проверки в записи tableview?

ответ

2

Если я вас правильно понял, вы хотите уведомление control:textShouldEndEditing: пожар в следующей ситуации:

  1. Вы добавляете новый объект в контроллер массива.
  2. Строка в таблице, представляющей объект, автоматически выбирается.
  3. Вы программно выбираете текстовое поле в соответствующей строке для редактирования.
  4. Пользователь немедленно (т.е. без внесения каких-либо изменений в текстовом поле) дает фокус на элемент управления в другом месте в UI

Один подход, который я использовал в прошлом, чтобы получить эту работу, чтобы сделать незначительное программное изменение редактора полей, связанного с текстовым полем, непосредственно перед тем, как текстовое поле станет доступным пользователю для редактирования. Фрагмент кода ниже показывает, как это сделать - это шаг 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) 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^