Мне кажется невероятным, что на самом деле не существует достойного решения этой проблемы.
По какой-то причине я нахожу методы тегирования и «использование визуального расположения ячейки на экране для определенияправильный объект модели », изложенный в других ответах, немного грязный.
Вот два разных подхода к проблеме:
Подкласс UITableViewCell
РешениеЯ пошел с подклассом UITableViewCell
@interface MyCustomCell : UITableViewCell
@property (nonatomic, strong) Model *myModelObject;
@end
При создании ячейки в cellForRowAtIndexPath:
вы, вероятно, будете использовать объект модели для заполнения данных ячейки.В этом методе вы можете назначить объект модели ячейке.
А затем в обработчике касания кнопки:
MatchTile *cell = (MatchTile *) sender.superview.superview;
if (cell && cell.myModelObject)
{
//Use cell.myModelObject
}
Я не на 100% доволен этим решением, если честно.Присоединение объекта домена к такому специализированному компоненту UIKit кажется плохой практикой.
Использование ассоциативных объектов Objective C
Если вы не хотите создавать подкласс для ячейки,еще одна хитрость, которую вы можете использовать, чтобы связать объект модели с ячейкой и получить его позже.
Чтобы извлечь объект модели из ячейки, вам потребуется уникальный ключ для его идентификации.Определите один из них следующим образом:
static char* OBJECT_KEY = "uniqueRetrievalKey";
Добавьте следующую строку в метод cellForRowAtIndexPath:
, когда вы используете объект модели для заполнения ячейки.Это свяжет ваш объект модели с объектом ячейки.
objc_setAssociatedObject(cell, OBJECT_KEY, myModelObject, OBJC_ASSOCIATION_RETAIN);
И затем, где бы у вас ни была ссылка на эту ячейку, вы можете получить объект модели, используя:
MyModelObject *myModelObject = (MyModelObject *) objc_getAssociatedObject(cell, OBJECT_KEY);
В отражении,хотя я выбрал первое (потому что я уже разделил ячейку на подклассы), второе решение, вероятно, немного чище, так как на ViewController остается ответственность за присоединение и извлечение объекта модели.UITableViewCell не нужно ничего знать об этом.