Ваша проблема двоякая:
Во-первых, вам нужно установить идентификатор для каждого из столбцов таблицы. Вы можете сделать это, выбрав столбец в Интерфейсном Разработчике, перейдя в Инспектор Идентификаций и установив для него некоторое строковое значение:
Как только вы это сделаете, создайте некоторые статические свойства для ссылки на эти идентификаторы (это не строго необходимо, поскольку вы, конечно, можете просто использовать rawValue
для простого сравнения строк Objective-C, но новые идентификаторы Swift 4 являются типобезопасными и, следовательно, предпочтительными). Сделайте это так:
extension ViewController: NSTableViewDelegate {
private struct TableColumns {
static let foo = NSUserInterfaceItemIdentifier("Foo")
static let bar = NSUserInterfaceItemIdentifier("Bar")
}
...
}
Теперь вы можете использовать эти идентификаторы для ссылки на ваши столбцы, используя tableColumn(withIdentifier:)
(или column(withIdentifier:)
, если вам нужен только номер столбца). Я рекомендую делать это везде, где вы ссылаетесь на них, в том числе в своем методе tableView(:viewFor:row:)
, поскольку то, как вы делаете это сейчас с tableView.tableColumns[0]
и т. Д., Зависит от порядка столбцов, и если пользователь переупорядочивает их, он может вызвать неожиданное поведение. Использование идентификатора гарантирует, что вы всегда смотрите на столбец, на который, как вы думаете, вы смотрите.
В любом случае, после того как вы настроили свои идентификаторы, вы можете решить вторую проблему: вы используете неправильный метод делегата. Вместо tableView(:shouldTypeSelectFor:searchString:)
, который предназначен для перехвата этих вещей на уровне событий (то есть пользователь просто нажал клавишу. Должен ли я вообще вызывать систему выбора типа?), Используйте tableView(:typeSelectStringFor:row:)
. Этот метод позволяет вам вернуть строку, заданную механизму выбора типа для каждой комбинации строки / столбца в вашей таблице. Для тех, которые вы хотите игнорировать type-select, просто верните nil
; в противном случае, верните строку, которую вы ожидаете ввести, чтобы выбрать эту конкретную строку. Итак, что-то вроде:
func tableView(_ tableView: NSTableView, typeSelectStringFor tableColumn: NSTableColumn?, row: Int) -> String? {
if tableColumn?.identifier == TableColumns.foo {
return directoryItems?[row].name
} else {
return nil
}
}