为每个UITableViewCell创建一个按钮

时间:2014-04-17 15:04:44

标签: ios objective-c uitableview uibutton

我正在尝试创建好友请求功能。所有朋友请求都会显示在表格中,玩家可以点击接受或拒绝。我想要做的是在这个UITableView旁边创建一个包含所有玩家朋友请求的接受按钮。

这是我的代码。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *notificationCell = [tableView dequeuREusableCellWithIdentifier@"notificationCell" for IndexPath:indexPath];

    NSArray *friendRequests = [self fetchAllFriendRequestsInArray];
    NSManagedObject *friendRequestingRelationship = [friendRequests objectAtIndex:indexPath.row];
    notificationCell.textLabel.text = [friendRequestingRelationship valueForKey:@"name"];

    UIButton *acceptButton = [UiButton buttonWithType:UIButtonTypeSystem];

    [acceptButton.frame = CGRectMake(notificationCell.frame.origin.x + 150, notificationcell.frame.origin.y -20, 80, 40);
    [acceptButton setTitle:@"Accept" forState:UIControlStateNormal];
    acceptButton.backgroundColor = [UIColor clearColor];
    [acceptButton addTarget:self action:@selector(acceptButtonPressed) forControlEvents:UIControlEventTouchUpInside];

    [notificationCell.contentView addSubview:acceptButton];

    return notificationCell;
}

只有第一个notificationCell显示了friendrequester的名字和Accept Button。其他通知细胞只显示其他朋友请求者'没有按钮的名字。我可以知道我的代码有什么问题,以便我可以让按钮显示在每个单元格上吗?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

按钮在那里,但它们会从视图中剪切掉。这条线是罪魁祸首:

acceptButton.frame = CGRectMake(notificationCell.frame.origin.x + 150, notificationcell.frame.origin.y -20, 80, 40);

您不应该将notificationCell的来源添加到按钮,因为子视图位置与其超级视图的位置相关。

这应该会给你正确的外观,但你的代码还有其他潜在的问题。

  • 您获取所有好友请求的行可能太慢,无法为视图中的每个单元格执行。确保缓存结果
  • 表视图细胞被回收。当其中一个回收的单元格进入您的代码时,看起来您的代码在第一个按钮上添加了第二个按钮
  • 同样,如果为不需要按钮的单元格返回带有按钮的回收单元格,则旧按钮将保持可见。

使用已有按钮的原型单元格可能会更好。除了添加和删除该按钮,您可以根据上下文使现有的按钮可见或不可见。

答案 1 :(得分:0)

这是解决此问题的一种不好的方法。你应该去故事板,然后在原型单元格中放一个按钮。然后选择该按钮,转到属性检查器,并设置"标记"你可以选择一些(例如我们会说1)。然后,您可以在抓住单元格后获取每个单元格的按钮:

UIButton * acceptButton = (UIButton *)[cell viewWithTag: 1];
[acceptButton addTarget:self action:@selector(acceptButtonPressed) forControlEvents:UIControlEventTouchUpInside];

这更干净,可以为您提供所需的结果。