2

我有一个 uitableview,其中包含从预定义的 nsarray 填充的 50 行。

如何选择多行,一次最多允许 3 行,并在选择时显示检查并在取消选择时删除检查/

我对 xcode 真的很陌生,非常感谢任何帮助。谢谢你。

4

2 回答 2

3

您的数据需要跟踪它是否被选中。

两种常见的方法是:预定义数组中的每个对象都有一个 BOOL 指示它是否被选中,或者您保留第二个数组,该数组仅包含对选定对象的引用。由于您只能选择三个,因此第二个选项可能会更好。

当有人在您的表格中选择一个单元格时,您会更改相关对象的选择状态,或者切换其 BOOL 或在额外数组中添加/删除它。这也是检查您是否已经拥有尽可能多的选择的地方。如果选择发生了变化,您将告诉您的表重新加载数据。

cellForRowAtIndexPath:您检查对象是否被选中并相应地标记它。

于 2012-07-30T15:47:50.297 回答
3
int counter = 0; //keep track of how many rows are selected
int maxNum = 3; //Most cells allowed to be selected

//Called when the user selects a row
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    //If the cell isn't checked and there aren't the maximum allowed selected yet
    if (cell.accessoryType != UITableViewCellAccessoryCheckmark && counter < maxNum)
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        counter++;
    }
    else if (counter >= maxNum) return; //Don't do anything if the cell isn't checked and the maximum has been reached
    else //If cell is checked and gets selected again, deselect it
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        counter--;
    }
}

您可能还希望保留所选单元格的索引数组,以防您想对其中的数据执行某些操作。如果您不知道如何执行此操作,请告诉我,我将添加代码。

笔记:

  • 您需要实现表视图委托协议才能正确调用此方法。
  • 这不是做到这一点的“最佳”方式(使用单元格内容来跟踪选择通常不受欢迎)但它非常容易。
  • 您可能会遇到单元重用的问题。如果要解决此问题,请存储单元格的索引并将附件类型设置为cellForRowAtIndexPath
于 2012-07-30T15:48:30.623 回答