不确定我是否应该将逻辑放在UITableViewController或UITableViewCell中

时间:2014-01-19 16:37:05

标签: ios objective-c uitableview

我有一个具有

的UITableViewCell
  • 两个标签
  • One TextView
  • 一个“接受”按钮
  • 一个“删除”按钮

接受和删除按钮基本上都是删除单元格。接受更改某些数据的状态,它将显示在另一个屏幕上,删除将完全删除它。

这是我展示tableviewcell的方法

- (InvitationCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString* cellIdentifier = @"Identifier";
    InvitationCell *cell = (InvitationCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];


    // Create a new PFObject Object
    PFObject *connection = nil;

    connection = [self.tableData objectAtIndex:[indexPath row]];
    PFObject *inviterCodeName = connection[@"Inviter"];
    [inviterCodeName fetch];

    cell.inviterCodeName = inviterCodeName; // Allows us to use this in the cell
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    [dateFormatter setLocale:enUSPOSIXLocale];
    [dateFormatter setDateFormat:@"EEE, MMM, h:mm a"];

    cell.dateLabel.text = [dateFormatter stringFromDate:[connection updatedAt]];


    cell.codeName.text = [NSString stringWithFormat:@"Invitee Code Name: %@", inviterCodeName[@"codeName"]];
    if (inviterCodeName[@"description"] == nil) {
        cell.codeNameDescription.text = @"";
    } else {
        cell.codeNameDescription.text = [NSString stringWithFormat:@"%@", inviterCodeName[@"description"]];
    }
    return cell;
}

我不确定的是我是否将accept / reject方法放在实际的UITableViewCell类中,或者是否将它们保存在具有所有UITableView方法的类中?

如果我将它们保存在具有所有UITableView方法的类中,如何使用自定义单元格中的两个按钮?我可以给他们打电话吗?我需要使用另一种委托方法吗?

2 个答案:

答案 0 :(得分:3)

关于你的第一个问题,我会说以下内容。不要将逻辑放在UITableViewCell内。单元格不是控制器而是视图。所以,它内部不应该有逻辑。控制器是正确的位置。

可以在UITableViewCell Is Not a Controller中找到关于它的好讨论。我真的建议你阅读它。

关于第二次讨论,您可以采取以下几种方式。例如,您可以直接在控制器中注册操作或使用委托模式。我更喜欢后者,因为它对我来说更清楚。但这是个人品味。例如,它允许在执行类似操作的另一个控制器中重用这些单元。

这是关于如何实现它的旧讨论。但它仍然有效。 Recipes to pass data from UITableViewCell to UITableViewController

希望它有所帮助。

答案 1 :(得分:2)

在您的InvitationCell.h文件中添加以下属性。

@property NSIndexPath *indexPath;

并将委托方法添加为。

-(void)deleteButtonClickedForIndexPath:(NSIndexPath *)indexPath;
-(void)acceptButtonClickedForIndexPath:(NSIndexPath *)indexPath;

在tableView控制器中, cellForRowAtIndexPath 方法添加以下代码行

cell.delegate=self;
cell.indexPath = indexPath;

将委托方法添加到控制器并根据indexPath值解决它们。