如何在UITableCell中传递一个对象以便在“AccessoryButtonTapped ...”方法中使用?

时间:2011-01-21 01:54:07

标签: objective-c

当用户选择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];
}

我错过的任何其他东西都是公平的游戏(我对这里的新想法持开放态度)

1 个答案:

答案 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];

减少代码的重复。