在Xcode中使用带有可重用单元格的按钮和TextFields

时间:2014-06-18 12:46:03

标签: ios objective-c uitableview uibutton

我想创建一个带有自定义表格视图单元格的留言板。每个单元格都有一个用于喜欢消息的按钮。在Facebook应用程序中,我想通知用户他按下按钮并更改其图像(在后台它将代码发送到服务器以节省喜好)。如果用户再次按下更改的按钮,则他将不同于该消息。

我的问题是,如果我按下一个单元格的按钮,图像将会改变,但滚动后我可以看到其他单元格具有相同的未按下按钮但是图像已更改。如果我向上和向下滚动,图像将始终在单元格中随机变化。这是textfields的问题,如果我输入一个单元格,我的文本会显示在另一个单元格中。这个问题的解决方案是什么?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
MessagesCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (!cell) {
    cell = [[MessagesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}
//...
    [cell.likeButton addTarget:self action:@selector(sendLike:) forControlEvents:UIControlEventTouchUpInside];
//...
}

- (void)sendLike:(id)sender {
UIButton * button = sender;
MessagesCell *cell = (MessagesCell *)button.superview.superview.superview;

NSIndexPath *indexPath = [self.messagesTableView indexPathForCell:cell];
NSLog(@"%@", indexPath);

if([cell.likeButton.imageView.image isEqual:[UIImage imageNamed:@"notliked"]])
{
    [button setImage:[UIImage imageNamed:@"liked"] forState:UIControlStateNormal];
}
else
{
    [button setImage:[UIImage imageNamed:@"notliked"] forState:UIControlStateNormal];
}
}

2 个答案:

答案 0 :(得分:4)

问题是您没有从单元格中分离数据(模型)(View)。您不应该使用UITableViewCells来存储您的数据。单元格被重用,这基本上意味着当一个单元格滚动离开屏幕时,它将再次被重复用于另一行。保持其儿童控制的状态。

例如,您可以存储数组中是否喜欢某个项目。然后在您的cellForRowAtIndexPath中根据该数组中的项目确定应显示哪个图像,而不是基于该单元格的子控件。始终将数据保存到某些非ui结构中。

这将导致更好的MVC分离。

答案 1 :(得分:-1)

我有同样的问题。 Cell设置为可重用,因此每个单元的标识符应该不同。否则它会认为每个单元格都是相同的并且会弄乱。

设置您的标识符,如下所示

NSString *CellIdentifier = [NSString stringWithFormat:@"%d_%d",indexPath.row,indexPath.section];

        MessagesCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
        cell = [[MessagesCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

我希望你的问题能够得到解决。