Добавление свойств в UIControls без создания подклассов - PullRequest
2 голосов
/ 13 декабря 2011

Я встроил UIButtons в мои TableViewCells.Чтобы отследить, к какой ячейке принадлежит кнопка, я хотел бы добавить свойство NSIndexPath в UIButton.Я не хочу создавать подкласс UIButton.Есть ли способ, которым я могу сделать это с категориями?

РЕДАКТИРОВАТЬ: Я считаю, что идея установки тегов не будет работать, если у меня есть несколько разделов в табличном представлении.Другой подход к просмотру суперпредставления кнопки для определения ячейки больше похож на хак.Ищите более чистый способ сделать это.

Ответы [ 3 ]

4 голосов
/ 13 декабря 2011

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

Лучший способ - использовать метод indexPathForRowAtPoint: UITableView. Когда действие вашей кнопки активировано (при условии, что цель находится в вашем контроллере табличного представления:

CGPoint point = [sender convertPoint:sender.center toView:self.tableView];
NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point];

sender здесь приведено к UIButton.

4 голосов
/ 13 декабря 2011

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

Следующее лучшее решение - ассоциативные ссылки . Они могут вешать данные на любой объект при правильном управлении памятью. Я обычно создаю категорию, которая добавляет свойство, реализованное с использованием objc_setAssociatedObject и objc_getAssociatedObject.

1 голос
/ 13 декабря 2011

Чтобы отследить, к какой ячейке относится кнопка

Вы уже знаете, к какой ячейке принадлежит кнопка: это ячейка, которой является подпредставление кнопки.

  1. Начните со ссылки на кнопку. (Если вы являетесь кнопкой, это self. Если вы являетесь целью кнопки для ее действия, то когда кнопка нажата и выдает сообщение действия, она передает себя в качестве параметра для сообщение действия, обычно называемое sender.)

  2. Просмотрите иерархию представлений (superview), чтобы найти UIViewTableCell, содержащую кнопку.

    UIView* v = theButton;
    while (![v isKindOfClass: [UITableViewCell class]]) v = v.superview;
    
  3. Теперь вы можете делать что угодно с этой информацией. Например, вы, кажется, хотите NSIndexPath; затем позвоните -[UITableView indexPathForCell:].

...