我觉得难以置信的是,没有真正的体面解决方案。
无论出于何种原因,我发现标记方法和'使用屏幕上单元格的可视位置来标识正确的模型对象'在其他答案中概述有点肮脏。
这里有两种不同的方法的问题:
子类的UITableViewCell
我cellForRowAtIndexPath:
有是子类的UITableViewCell
@interface MyCustomCell : UITableViewCell
@property (nonatomic, strong) Model *myModelObject;
@end
在创建细胞去的解决方案,您是可能会使用模型对象来填充单元格数据。在这种方法中,您可以将模型对象分配给单元格。
然后在按钮自来水处理:
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不需要知道任何事情。
您使用的是didSelectRow:方法? – tipycalFlow