SnapSh0t
@SnapSh0t
iOS-Developer

Как обратиться к элементам в ячейках?

Привет!

Научите раз и навсегда как обратить и изменить данные в ячейках?

К примеру, есть класс:
class TableViewCell: UITableViewCell {
    @IBOutlet weak var label: UILabel!
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        cell.label.text = "text"
return cell
}


Дальше у меня есть какая-нибудь функция:
func renameLabel() {

}


И как, к примеру, мне изменить label, или же setImage у Button. Я все никак не могу понять как к ним обратиться за пределами cellForRowAt и как изменить у них значение.

Надеюсь, вы мне поможете разобраться с этим вопросом.
  • Вопрос задан
  • 1846 просмотров
Решения вопроса 2
briahas
@briahas
ObjC, Swift, Python
У меня ответ будет другой.

Работая с таблицей (коллекшнвьюхой) вы всегда устанавливаете им Датасорс. Это объект который снабжает таблицу данными. А, данные, это и есть: текст на ячейке, картинка, хзчтоеще. И, обычно, гдето, (в датасорсе), хранится массив объектов которые держат в себе ТЕКУЩИЕ тексты, картинки, хзчтоеще для отображения в таблице.

И, если вы когда нибудь последуете описанной мною выше логике то, вы должны ВНАЧАЛЕ изменить пропертю у соответствующего объекта хранящегося в массиве (обычно вычисляется по индексу, т.е. если надо чтобы в первой ячейке изменился текст - берете первый объект из массива), а ПОТОМ делать reloadData

И в cellForRowAt indexPath у вас бeдет что-то типа:
cell.label.text = models[indexPath.row].title
Ответ написан
Комментировать
@iMaximus
На самом деле, первый ответ был верный, хотя и без конкретики.
Обращаться к ячейке нужно через табличные методы. Т.е. данные можете менять где угодно, потом их подставляете в метод где ячейка создается и перезагружаете либо таблицу целиком либо какие то специфические ячейки. Пример.

class MaxTable:UITableViewController 
{
  
    var labelText:String = ""

    override func viewDidLoad()
    {
        super.viewDidLoad()
       labelText = "Text"
    }

func renameLabel() 
{

  labelText = "New Text"

  // Перезагружаем все таблицу 
   self.tableView.reloadData()

// Либо перезагружаем первую ячейку-можно добавить несколько
   let pathsArray = [IndexPath(item: 0, section: 0)]
   self.tableView.reloadRows(at: pathsArray, with: UITableViewRowAnimation.none)
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
 cell.label.text = labelText
return cell
}


Естественно, методы которые делают reload, должны быть в главном потоке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
doublench21
@doublench21 Куратор тега Swift
А чего тут сложного, эмм? Я работаю с таблицей, в качестве контекста для всех ячеек выступает моя ссылка на таблицу, ах вот же она tableView: UITableView. Наверное мне стоит глянуть на методы этого класса. https://developer.apple.com/documentation/uikit/ui...
Accessing Cells and Sections
Вот же они. Юху
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы