используя пользовательский класс, определенный в раскадровке - PullRequest
1 голос
/ 02 июня 2019

В Xcode я могу определить собственный класс в инспекторе идентификаторов, но как я могу их использовать?Следующий пример:

enter image description here

class c1 : UITableViewCell {

  func celltest() {
        let i = 99;
    }
}

class NicePlaceTableViewController: UITableViewController {
.
.
.
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
        **cell.celltest()** .. has no member celltest
        let place = places[indexPath.row]
        cell.textLabel?.text = place.name
        cell.detailTextLabel?.text = "\(place.timestamp)"
        return cell
    }

Если будет известен reuseIdentifier, но не его пользовательский класс - в данном случае «c1» - как я могу получить доступметоды, определенные в классе c1 без нарушения проверок компиляции Xcodes?

Ответы [ 4 ]

1 голос
/ 02 июня 2019

Xcode Interface Builder - это IDE для визуального создания сценариев пользовательского интерфейса.

Ваша конфигурация ячейки, которая находится внутри табличного представления, создаст экземпляр NicePlaceTableViewController с ячейкой c1, зарегистрированной в табличном представлении.

Если Xcode с инструментом Interface Builder отсутствует, вам необходимо создать его программно самостоятельно следующим образом:

class NicePlaceTableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(c1.self, forCellReuseIdentifier: "Cell1")
    }
}

Этот код регистрирует тип класса для данного идентификатора.Для доступа к ячейке необходимо использовать метод tableView.dequeueReusableCell, который будет действовать во внутреннем пуле для создания или повторного использования ячейки.

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
}

Удаленная ячейка имеет тип UITableViewCell.Если вы хотите понизить его до типа c1, то вы должны использовать!оператор.

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! c1
1 голос
/ 02 июня 2019

Вам просто нужно типизировать ячейку как объект c1. Вы можете сделать это, написав приведенный ниже код в методе cellForRowAt следующим образом:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! c1

Таким образом, компилятор будет знать тип вашего пользовательского класса ячейки таблицы, и cell.celltest() не выдаст вам ошибку.

Еще одна ссылка на быстрое руководство по стилю, которое может помочь вам с именами классов и методов:

https://github.com/raywenderlich/swift-style-guide

1 голос
/ 02 июня 2019

Я не знаю имени класса "c1".Есть ли способ получить его динамически?Я не понимаю, почему ячейку запрашивает ее reuseIdentifier "cell1", а xcode не знает о классе, который должен быть указан в ячейке?(C1)

1 голос
/ 02 июня 2019

Вам просто нужно принудительно преобразовать его в c1:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! c1
cell.celltest()

Кстати, c1 не является хорошим именем класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...