当用户选择accessoryButton时,我正在推送另一个视图控制器,而缺少的组件是能够传递我的域对象的能力。
当前的hack是将UITableCell上的“tag”属性设置为我的对象,并将其拉出“accessoryButtonTapped”函数。如果只有这个工作:)
我的第一个问题是 - 在accessoryButtonTappedForRow方法中我需要它时如何传递一个对象?
我的第二个问题是 - 如果我的黑客确实有效,我怎样才能从单元格中抛出对象?
这是我的“cellForRowAtIndexPath”实现,我将单元格的tag属性设置为我的对象
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
if ([self.myArray count] > 0) {
MyClass* obj = [self.myArray objectAtIndex: [indexPath row]];
cell.textLabel.text = @"click the accessory button for details";
cell.tag = obj;
}
//other code here to finish the implementation ...
}
这是我的“accessoryButtonTappedForRow ...”实现,当我尝试将其取出时,它不返回任何标记
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
MyClass* obj = [[tableView cellForRowAtIndexPath:indexPath] tag];
}
我错过的任何其他东西都是公平的游戏(我对这里的新想法持开放态度)
答案 0 :(得分:2)
答案是你不应该。
在您尝试实施的方式中,您使用UITableCell
来存储要操作的数据。然后,您需要保持UITableCell
中存储的内容与self.myArray
中存储的内容之间的一致性。在一个简单的程序中,它没有问题,但它最终会变得一团糟。
相反,只需直接从模型(在本例中为self.myArray
)检索表示UITableCell
的对象。这样,数据总是从myArray
(模型)流向UITableCell
(视图),而不是相反。这使得程序从长远来看更容易理解。
具体地说,在你的
中- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
和
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
您正在访问第一个模型,而您正尝试访问第二个模型。别。只需使用
MyClass* obj = [self.myArray objectAtIndex: [indexPath row]];
两个委托方法中的。或者更好,我会定义一个方法
-(MyClass*) objForIndexPath:(NSIndexPath*)indexPath{
return [self.myArray objectAtIndex: [indexPath row]];
}
并使用
MyClass* obj = [self objForIndexPath:indexPath];
减少代码的重复。