didSelectRowAtIndexPath一次select多行

我有一个UITableView填充了27行。 我正在尝试更改所选单元格的accessoryType 。 我在didSelectRowAtIndexPath: delegate方法中这样做。

我面临的问题是,当select一行并更改单元格的accessoryType时,该行的第十一行也会被修改。

我已经尝试打印[indexPath row]值,但它只显示被选中的行,而不是另一个。

我真的很困惑, 请帮助我。

添加了代码 cellForRowAtIndexPath方法

 UITableViewCell *cell; if ([indexPath row] == 0) { cell = [tableView dequeueReusableCellWithIdentifier:@"acell"]; } else { cell = [tableView dequeueReusableCellWithIdentifier:@"bcell"]; } cell.selectionStyle = UITableViewCellSelectionStyleNone; if (cell == nil && [indexPath row] != 0) { cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier:@"bcell"] autorelease]; } else if(cell == nil && [indexPath row] == 0){ cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier:@"acell"] autorelease]; } if ([cell.contentView subviews]){ for (UIView *subview in [cell.contentView subviews]) { [subview removeFromSuperview]; } } if ([indexPath row] == 0) { cell.textLabel.text = @"Select All"; cell.textLabel.font = [UIFont boldSystemFontOfSize:13.0f]; } else { cell.textLabel.text = @"Some Text Here" cell.detailTextLabel.text = @"Another piece of text here" } return cell; 

我正在做%10因为行为在第11行之后重复,因此试图为每第11行创build一个新对象。

didSelectRowAtIndexPath方法的代码是

 UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { if ([indexPath row] != 0) { NSIndexPath *tempIndex = [NSIndexPath indexPathForRow:0 inSection:0]; UITableViewCell *tempCell = [tableView cellForRowAtIndexPath:tempIndex]; tempCell.accessoryType = UITableViewCellAccessoryNone; } cell.accessoryType = UITableViewCellAccessoryNone; } else{ cell.accessoryType = UITableViewCellAccessoryCheckmark; } if ([indexPath row] == 0) { for (int i = 0; i < [dataSource count]; i++) { NSIndexPath *tempIndex = [NSIndexPath indexPathForRow:i+1 inSection:0]; UITableViewCell *tempCell = [tableView cellForRowAtIndexPath:tempIndex]; if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { tempCell.accessoryType = UITableViewCellAccessoryCheckmark; } else{ tempCell.accessoryType = UITableViewCellAccessoryNone; } } } 

请帮我多选或以其他方式解决多选的问题。

提前致谢!!

以下是一种方法:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } [cell.textLabel setText:[NSString stringWithFormat:@"Row %d", indexPath.row]]; NSIndexPath* selection = [tableView indexPathForSelectedRow]; if (selection && selection.row == indexPath.row) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } else { cell.accessoryType = UITableViewCellAccessoryNone; } // Configure the cell. return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark; } - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone; } 

记住表格视图中的每个单元格实际上是被重用的同一个对象。 如果每次调用cellForRowAtIndexPath时都没有设置附件types,那么当新的单元格滚动到屏幕上时,它们将具有相同的附件。

多选

对于多重select,这有点复杂。

你的第一个select:未logging的API

请注意,这只在表格处于编辑模式时才起作用。 将每个单元格的编辑样式设置为未logging的UITableViewCellEditingStyleMultiSelect。 一旦你这样做,你可以通过UITableView:indexPathsForSelectedRows的未公开的成员获取表视图的select。 这应该返回所选单元格的数组。

你可以通过把它放在一个头文件中公开这些function:

 enum { UITableViewCellEditingStyleMultiSelect = 3, }; @interface UITableView (undocumented) - (NSArray *)indexPathsForSelectedRows; @end 

然后为每个单元格设置编辑样式,如下所示:

 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleMultiSelect; } 

当表格处于编辑模式时,您将看到单元格上的多选控件。

要查看其他未公开的API,可以使用nm命令行实用程序,如下所示:

 nm /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/UIKit.framework/UIKit 

你的第二个select:自己pipe理select

让你的UITableView子类包含一个数组,指示哪些单元格被选中。 然后在cellForRowAtIndexPath中,使用该数组configuration单元格的外观。 你的didSelectRowAtIndexPath方法应该看起来像这样:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([tableView indexPathIsSelected:indexPath]) { [tableView removeIndexPathFromSelection:indexPath]; } else { [tableView addIndexPathToSelection:indexPath]; } // Update the cell's appearance somewhere here [tableView deselectRowAtIndexPath:indexPath animated:NO]; } 

这假定您在UITableView子类中创buildindexPathIsSelected,removeIndexPathFromSelection和addIndexPathToSelection方法。 这些方法应该完全按照它们的名称所暗示的那样进行:添加,删除和检查数组中的索引path。 如果使用此选项,则不需要执行didDeselectRowAtIndexPath。

记住表格视图中的每个单元格实际上是重用的同一个对象。 如果每次调用cellForRowAtIndexPath时都不设置附件types,那么当新的单元格滚动到屏幕上时,它们都将具有相同的附件。“ – daxnitro

这是我被抓到的地方。 我有我的设置,以便在我的“cellForRowAtIndexPath”函数中,我只会更改附件的指定在我的数组中检查单元格,当我应该做的是更新表中的所有单元格的附件。

换一种说法:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //normal set up //retrieve key NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; id obj = [settings objectForKey:@yourKey]; //if the array is not populated, keep standard format for all cells if (obj == nil){ selectedStyles = [[NSMutableArray alloc] initWithObjects:nil]; [cell setAccessoryType:UITableViewCellAccessoryNone]; //no check mark [cell textLabel].textColor = [[UIColor alloc] initWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1.0]; //keep black color } //else retrieve information from the array and update the cell's accessory else{ //if the cell is in your array, add a checkbox [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; //add check box [cell textLabel].textColor = [[UIColor alloc] initWithRed:50.0/255 green:79.0/255 blue:133.0/255 alpha:1.0]; //change color of text label //if the cell is not in your array, then keep standard format [cell setAccessoryType:UITableViewCellAccessoryNone]; //no check mark [cell textLabel].textColor = [[UIColor alloc] initWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1.0]; //keep black color 

希望这可以帮助!