Как уменьшить размер дефолтного ImageView в TableViewCell?

customtableviewcell
swift
tableview

#21

Это решение проще и понятнее, но, как сейчас уже обнаружилось по ходу тестирования, у него есть один недостаток. Если данные в таблице будут сортироваться или если будет выполняться поиск, то данные будут искажаться. Например, если привязать к кнопке определенное действие, то после сортировки значение лейбла в ячейке изменится, а действие кнопки останется прежним.


#22

понятно, спасибо)) я взяла на заметку решение RexHunt и попробую его при случае


#23

Странно, я думал это самые основы, которым учат в начале при работе с таблицами. Да и вобще с таблицами всегда надо работать через делегат. Бывают конечно исключения, но под свои нужды.


#24

то, что таблица работает через делегат, это как бы понятно. Вопрос в другом. В частности, класс CustomViewCell подписывается под протокол не самим классом, а своим свойством delegate. И потом @IBAction функция вызывает это свойство, которое в свою очередь вызывает такой же метод и передает в параметры этой функции саму ячейку.

weak var delegate: CustomCellDelegate?

@IBAction func didTapButton(_ sender: Any) {
        delegate?.didTapButton(self)
    }

Если не затруднит, могли бы вы пояснить, здесь метод didTapButton() он один и тот же в двух местах или два разных метода с одинаковым названием?

И второй момент, в TableViewController реализуется такой же метод протокола:

func didTapButton(_ cell: CustomTableViewCell) {
        
        if let indexPath = tableView.indexPath(for: cell) {
            
            // ToDo something
        }
    }

Могли бы вы здесь также пояснить, откуда в параметры этой функции приходит cell? Какова в целом механика связи с CustomViewCell в данном случае?


#25

С терминологией немного напутали.
Под делегат подписывается не ячейка, а VC: cell.delegate = self
Метод в обоих случаях разный.
В ячейке метод нажатия можно назвать как угодно. Все дело в методе самого делегата.
Сам же делегат служит проводником. Он подает сигнал в ваш VC из ячейки при нажатии на кнопку. А т.к. вы в VC подписались под этот делегат, то VC обязательно должен иметь данный метод, что бы отловить тот самый сигнал из ячейки.
Указатель на cell передается из самой ячейки через делегат как self.


#26

Спасибо!

Но так сразу все не переварить))
Т.е. получается, что если два класса подписаны на протокол с методом, то вызов этого метода в классе CustomCell автоматически запускает такой же метод в TableViewController?


#27

Вызовится метод если VC загружен. Мало вероятно что у вас будет загружено 2 VC.


#28

здесь не совсем понятно. Если пользователь нажимает кнопку, которая расположена в кастомной ячейке и которая запускает метод протокола, то вызов этого метода запустит тот же протокольный метод, но уже во ViewController?

Т.е. хотелось бы разобраться как работает связь между этими двумя методами, которые по идее являются одним и тем же методом протокола, но один реализован в кастомной ячейке, а другой в делегате, т.е. во ViewController.


#29

у вас случаем нету раздвоения личности?
метод реализован только в VC, в ячейке нету этого метода.
у Ивана вроде даже туториал был как работать с делегатами, поищите.


#30

Почему вы говорите, что метод реализован только в VC? Вот ваш код, здесь есть этот метод в ячейке. Если это метод протокола, то он ведь должен быть реализован в обоих классах - и VC, и Cell.

class MyCell: UITableViewCell {
    weak var delegate: MyCellDelegate?

    @IBAction func didTapButton(_ sender: Any) {
        delegate?.didTapButton(self)
    }
}

#31

Все неверно. Я уже писал об этом.


#32

при всем уважении, мы похоже говорили о разных вещах. Меня больше всего интересовало, как один метод связан с другим, как он его вызывает. И вот, наконец, ответ нашелся, цитирую из документации Apple:

The delegating object automatically makes its delegate an observer of all notifications it posts. All the delegate needs to do is implement the associated method to get the notification.

Т.е. получается, что когда мы назначаем делегата, то под капотом автоматически создается уведомление. Теперь связь между этими двумя методами понятна.