1

我在 uitable 视图中有 30 行,我正在尝试选择多行并将它们设置为选中。

每当我选择一行时,都会自动选择另一行并检查所需的行。

此外,当我滚动表格视图时,它会自动更改选择。

我使用的代码行数较少(8),而且效果很好。对于超过 12 行,它给出了我所描述的问题。

如果您可以建议任何其他代码/教程以使其工作也可以。

我是 xcode 的新手,非常感谢任何帮助。谢谢你。

这是我的代码:

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [listOfItems count];
}

// Customize the appearance of table view cells.
- (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];
}

// Configure the cell...
NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];
cell.text = cellValue;

return cell;
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

    if(count < 3)
    {

        [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
        [selectedIndexes addObject:[NSNumber numberWithInt:indexPath.row]];
        count++;
    }

    NSLog(@"Count: %d", count);
    NSLog(@"Items I selected @ %d:", indexPath.row);
    NSLog(@"Items I selected: %@", selectedIndexes);
} 

else {

    [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
    [selectedIndexes removeObject:[NSNumber numberWithInt:indexPath.row]];
    count --;
    NSLog(@"Items I de-selected @ %d:", indexPath.row);

}

[tableView deselectRowAtIndexPath:indexPath animated:NO];

NSMutableString *resultlearning = [[NSMutableString alloc]init];
for (int i = 0; i < [listOfItems count]; i++) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
    //[tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        [resultlearning appendFormat:@"%@, ",cell.textLabel.text];
    }
}
if (resultlearning.length > 2) {
    [resultlearning replaceCharactersInRange:NSMakeRange(resultlearning.length-1, 1) withString:@""];
}
NSLog(@"Result: %@",resultlearning);
}
4

4 回答 4

2

单元格被缓存并重复使用,因此如果您将附件设置为一个,然后将其用于表格中的不同位置,它仍然具有附件。

最好只跟踪方法中选择了哪些单元格作为数据,didSelectRowAtIndexPath:然后为cellForRowAtIndexPath:.

于 2012-07-25T12:17:59.160 回答
2

检查/取消检查单元格的附件类型的逻辑应该去 cellForRowAtindexPath。在 didSelectRowAtIndexPath 中,您应该只处理选定的行。

于 2012-07-25T12:23:59.533 回答
1

在 .h 文件中添加一个 mutablearray。这里向数组中添加与 tableDataSourc 数组一样多的对象。现在我的意图是,如果它包含 0 则不选择该单元格,或者它包含 1 则选择该单元格

现在这样做,因为你有 selectedIndexes 数组,所以需要另一个 mutablearray :

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
for(int i = 0;i<[listOfItems count];i++)
{
[selectedIndexes addObject:@"0"];
}
   return [listOfItems count]
 }


 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

 if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

     [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
     [selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"1"];
}
else
{          
selectedCell.accessoryType = UITableViewCellAccessoryNone;
[selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"0"];
}

现在 selectedIndexes 具有 1 值的对象意味着在 listOfItems 中选择了该值

于 2012-07-25T12:21:31.953 回答
0

嗯...今天早上我还在喝第一杯咖啡,但有些事情告诉我,当调用 didSelectRowAtIndexPath 时,您已经“选择”了行。然后似乎 if 语句可能正在做一些时髦的事情并选择下一行或其他东西。您是否尝试过注释掉 if 语句?我知道一次可能只会选择一个,但只是看看是否是原因。另外,它是被选中的下一行,前一行吗?

于 2012-07-25T12:15:01.923 回答