Как определить, был ли TableViewCell повторно использован или создан - PullRequest
1 голос
/ 30 апреля 2020

В Swift с API dequeueReusableCell у нас нет контроля над созданием нового экземпляра TableViewCell. Но что, если мне нужно передать некоторые начальные параметры в мою пользовательскую ячейку? Установка параметров после удаления потребует проверки, если они уже установлены и кажутся более уродливыми, чем это было в Objective- C, где можно было создать собственный инициализатор для ячейки.

Вот Пример кода того, что я имею в виду.

Objective-C, assuming that I don't register a class for the specified identifier:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* reuseIdentifier = @"MyReuseIdentifier";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (!cell)
    {
        cell = [[MyTableViewCell alloc] initWithCustomParameters:...]; // pass my parameters here

    }
    return cell;
}

Swift:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyReuseIdentifier")
    if let cell = cell as? MyTableViewCell {
       // set my initial parameters here
       if (cell.customProperty == nil) {
           cell.customProperty = customValue
       }
    }
}

Я что-то пропускаю или это так, как должно работать в Swift?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2020

Всегда до того, как UITVCells будет повторно использоваться внутри вашего класса Cell, будет вызван prepareForReuse(). Вы можете использовать этот метод для сброса всего содержимого, например imageView.image = nil.

Используйте инициал из UITVCell init(style: UITableViewCell.CellStyle, reuseIdentifier: String?), чтобы узнать, была ли создана ячейка.

Если вы хотите узнать эту информацию внутри вашего класса tableView, используйте func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) метод делегата.

PS: не забудьте позвонить super.

0 голосов
/ 05 мая 2020

Рабочий подход в основном такой же, как Objective- C: НЕ регистрируйте ячейку для "MyReuseIdentifier" и используйте dequeueReusableCell (withIdentifier:)

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "MyReuseIdentifier")
    if cell == nil {
        cell = MyTableViewCell.initWithCustomParameters(...)
    }
    return cell
}
0 голосов
/ 30 апреля 2020

В быстром или объективном - c dequeueReusableCell вернет ячейку, если есть доступная 1, или создаст другую, если ее нет, кстати, то, что вы делаете в obj c, можно сделать в быстрой, это то же самое

...