gpt4 book ai didi

objective-c - didSelectRowAtIndexPath 一次选择多行

转载 作者:可可西里 更新时间:2023-11-01 03:37:59 24 4
gpt4 key购买 nike

我有一个填充了 27 行的 UITableView。我正在尝试更改所选单元格的 accessoryType。我在 didSelectRowAtIndexPath: 委托(delegate)方法中执行此操作。

The problem I am facing is that, when selecting a row and changing the accessoryType of the cell, the eleventh row from that row also gets modified.

我已经尝试打印 [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 行创建一个新对象。

我的 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;
}

请记住, TableView 中的每个单元格实际上都是重复使用的同一个对象。如果您没有在每次调用 cellForRowAtIndexPath 时都设置附件类型,则当新单元格滚动到屏幕上时,它们都将具有相同的附件。

多选

对于多项选择,它有点复杂。

您的第一个选择:未记录的 API

请注意,这仅在表格处于编辑模式时有效。将每个单元格的编辑样式设置为未记录的 UITableViewCellEditingStyleMultiSelect。执行此操作后,您可以通过 UITableView 的未记录成员获取 TableView 的选择:indexPathsForSelectedRows。这应该返回所选单元格的数组。

您可以通过将其放在 header 中来公开这一点功能:

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

您的第二个选择:自己管理选择

让您的 UITableView 子类包含一个数组,指示选择了哪些单元格。然后在 cellForRowAtIndexPath 中,使用该数组配置单元格的外观。你的 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 子类中创建了 indexPathIsSelected、removeIndexPathFromSelection 和 addIndexPathToSelection 方法。这些方法应该完全按照其名称的含义进行操作:添加、删除和检查数组中的索引路径。如果选择此选项,则不需要 didDeselectRowAtIndexPath 实现。

关于objective-c - didSelectRowAtIndexPath 一次选择多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6057819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com