SnapSh0t
@SnapSh0t
Студент магистратуры "Информационные технологии"

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

Привет!

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

К примеру, есть класс:
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 и как изменить у них значение.

Надеюсь, вы мне поможете разобраться с этим вопросом.
  • Вопрос задан
  • 107 просмотров
Решения вопроса 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
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы