Значение доступа NSTableView - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужен доступ к значениям TableView на основе моей ячейки с другого контроллера.Я делаю этот код в моем главном контроллере, а tableView находится в дочернем контроллере.
Вот что я делаю, но получаю ноль ...

// First grab the tableView controller
let myTableViewController = self.children[0] as! MyTableViewController

// Now I want to access the first row to get values of the textFields
let firstRowView = myTableViewController.theTable.rowView(atRow: 0, makeIfNecessary: true)

//Let's try another way :
let firstView = myTableViewController.theTable.view(atColumn: 0, row: 0, makeIfNecessary: true)

//I can't do more because "firstRowView" and "firstView " are nil

enter image description here

Мне нужен массив, содержащий всю строку таблицы, например:

let array1 = ["Peter","Quinn","1","387","49"]

РЕДАКТИРОВАТЬ:

Я пытался с просмотр базы tableView, он работает, я могу получить textFields в моем массиве.
Но если отредактировать текстовое поле, щелкнув по нему (изменив «Питер» на «Франк»), это не сработает, NSTextField исчезает в утилите отладки ...

let firstRowView = myTableViewController.theTable.rowView(atRow: 0, makeIfNecessary: true)?.subviews // return the first TableView
let textFields = firstRowView!.map { $0.subviews } as! [[NSTextField]]
let texts = textFields.map {$0.first!.stringValue}

print(texts) // let array1 = ["Peter","Quinn","1","387","49"]

Почему я больше не работаю, если я вручную изменяю текст?

Вот что содержит "firstRowView", когда я надеваюне редактировать ячейку вручную: enter image description here

И вот что содержит «firstRowView», когда я вручную редактирую ячейку, и она разбилась: enter image description here

Вы можете видеть, что NSTableCellView преобразован в NSView, и мое textField исчезло ... (оно все еще есть в пользовательском интерфейсе, конечно ...)

1 Ответ

0 голосов
/ 15 февраля 2019

Прежде всего, никогда не получите данные из представления (представление таблицы), получите их из модели (массив источника данных).

В macOSесть очень удобный способ.Используйте привязки какао и табличное представление .За исключением модели, код почти не нужен.

  • Создайте модель, класс, унаследованный от NSObject, обязательно должен использовать преимущества кодирования значения ключа

    @objcMembers
    class Person : NSObject {
        dynamic var firstName, lastName : String
        dynamic var age : Int
        dynamic var number1, number2 : Int
    
        init(firstName : String, lastName : String, age : Int, number1 : Int, number2 : Int) {
            self.firstName = firstName
            self.lastName = lastName
            self.age = age
            self.number1 = number1
            self.number2 = number2
        }
    }
    
  • Объявите массив источника данных

    @objc dynamic var people = [Person]()
    
  • и заполните его

    override func viewDidLoad() {
        super.viewDidLoad()
        people = [Person(firstName: "Peter", lastName: "Quinn", age: 1, number1: 387, number2: 49),
                  Person(firstName: "Peter", lastName: "Quinn", age: 1, number1: 387, number2: 49)]
    }
    

Этовесь код. Теперь сделайте привязки.

В Интерфейсном Разработчике сначала выберите представление таблицы (самый простой способ - * щелкнуть в области просмотра таблицы и выбрать Просмотр таблицы ), перейдите в Инспектор привязок (нажмите ⌥⌘7 ) и привяжите Содержимое к View Controller и установите Путь модели ключа до people.

enter image description here

Затем выберите текстовые поля одно за другим - снова ⌃⇧-кликните в каждом текстовом поле в представлении таблицы ивыберите Ячейка табличного представления - и привяжите Значение к Table Cell View и установите Путь к ключу модели к objectValue.<property>, например

enter image description here

Вот и все.Все изменения в табличном представлении (например, редактирование поля) синхронизируются с моделью.Если вы хотите получить имя второй записи, просто напишите

let secondFirstName = people[1].firstName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...