2012-07-30 66 views
2

我有一个uitableview,有50行从预定义的nsarray填充。UITableView multiselect

我如何可以选择多个与行说最多3个在同一时间,并显示检查允许选择何时取消时删除检查/

我真正的新Xcode和任何的帮助深表感谢。谢谢。

回答

3

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

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

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

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

+0

这个答案是更好的编码风格。 – Dustin 2012-07-30 16:01:38

+0

好的,你可以用一段代码解释一下吗?这会让我更容易理解。谢谢 – 2012-07-30 16:49:46

+0

有一个苹果公司提供的示例项目可以做到这一点的简单版本。在文档中找一个名为ListAdder的人。 – 2012-07-30 18:13:53

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
+0

小问题:您需要首先获取单元格。更大的问题:我怀疑如果单元格被缓存并且用户滚动,这会导致不一致的结果。 – 2012-07-30 15:56:49

+0

你是对的,我意识到,只要我发布答案,并稍微编辑它来说明行为。我只是试图想出最简单/最少的编码方法,并假定这些单元没有被重用。 OP是XCode的新手,所以我不想混淆他。 – Dustin 2012-07-30 16:00:23

+0

谢谢。评论中描述的问题,我该如何解决这个问题?或者你写的第三个笔记提供了一种不同的方式,你能否用一段代码来解释一下,以帮助我更好地理解?谢谢。 – 2012-07-30 16:51:38