Задать вопрос
@zzasdee

Как изменить UILabel при скролле UIScrollView внутри UITableViewCell?

Суть вопроса: есть UITableView. Внутри неё кастомные ячейки класса MyTabbleViewCell. Внутри ячейки лежит UIScrollView (который скроллится горизонтально) и UILabel.
MyTabbleViewCell
|- ContentView
|--UIScrollView
|--UILabel

Мне надо при скролле скролл вью изменять значения в лейбле.
Я сделал свой MyScrollView. В нём:
@property (strong, nonatomic) id parent;

Во время создания ячеки
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

я выставляю
cell.scrollView.parent = cell;

Теперь могу делать так:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ([scrollView isKindOfClass:[MyScrollView class]])
    {
        if (scrollView.parent)
        {
            MyTableViewCell *cell = scrollView.parent;
            cell.myLabel.text = ...
        }
    }
}


Также можно сохранять в MyScrollView indexPath ячейки. Это не суть важно.
Вопрос: как-нибудь ещё более элегантно можно это сделать?
  • Вопрос задан
  • 255 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Flanker_4
@Flanker_4
Странная ситуация, мой ответ исчез куда-то. Или же я по глупости нажал Предпросмотр вместо Опубликовать.

Ваш подход чертовски плох.
1) Циклическая ссылка вот тут cell.scrollView.parent = cell;
2) ScrollView лезит вверх по иерархии и чего-то меняет в дочернем элементе родителя. Очень плохая практика.

Что бы причесать все, нужно сделать примерно следующее.
1) Скорей всего прибить сабклас UIScrollView, если он ничего кроме ссылки на парента и обработчика делегата не делает.
2) ScrollView объявить как UIScrollView и убрать его из публичных свойств. Сделать его приватным, и проинициализировать где-то в awakeFromNib или init
self.scrollView.delegate = self;
Предварительно подтвердив интерфейс UIScrollViewDelegate для класса ячейки
3) Объявить метод scrollViewDidScroll внутри класса ячейки, выкинув эти тонны проверок.
- (void)scrollViewDidScroll:(DSScrollView *)scrollView
{
      //хотя может и добавить проверку на if (scrollView==self.scrollView)
      self.myLabel.text = ...
}
Ответ написан
Комментировать
@zzasdee Автор вопроса
Что-то я погорячился со strong ссылкой. Week не увеличит retain count и цикла не будет.
@property (week, nonatomic) id parent;

А по сути то чем отличается установка делегата от моего варианта?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы