如何以编程方式选择uitableview行

时间:2013-01-19 05:01:13

标签: ios objective-c cocoa-touch uitableview

我正在尝试发送一个电子邮件,例如在uitableview中选择所有功能,在同一个按钮点击用户可以勾选或删除所有复选标记,此外用户还可以选择/取消选择行(在didSelectRowAtIndexPath上)。我尝试过,但它工作不正常,这是我的代码。

- (IBAction)selectAll:(id)sender
{
    if(myBoolean)
    {
        for (NSInteger s = 0; s < self.iTable.numberOfSections; s++)
        {
            for (NSInteger r = 0; r < [self.iTable numberOfRowsInSection:s]; r++)
            {
                [[self.iTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:r inSection:s]] setAccessoryType:UITableViewCellAccessoryNone];
            }
        }

        myBoolean = NO;

        [_selectUnselectButton setTitle:@"Select all Friends" forState:UIControlStateNormal];
    }
    else
    {
        for (NSInteger s = 0; s < self.iTable.numberOfSections; s++)
        {
            for (NSInteger r = 0; r < [self.iTable numberOfRowsInSection:s]; r++)
            {
                [[self.iTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:r inSection:s]] setAccessoryType:UITableViewCellAccessoryCheckmark];
                NSLog(@"%d-%d",s,r);
            }
        }

        myBoolean = YES;

        [_selectUnselectButton setTitle:@"Unselect all Friends" forState:UIControlStateNormal];
    }
}


-(void)tableView:(UITableView *)tableView_ didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView_ cellForRowAtIndexPath:indexPath];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
}

8 个答案:

答案 0 :(得分:8)

我写了sample code,我根据你的需要进行了调整。

基本上是

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *unifiedID = @"aCellID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:unifiedID];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:unifiedID];
    }

    cell.textLabel.text = [self.states objectAtIndex:indexPath.row];

    //if the indexPath was found among the selected ones, set the checkmark on the cell
    cell.accessoryType = ([self isRowSelectedOnTableView:tableView atIndexPath:indexPath]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    return cell;

}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *state = [self.states objectAtIndex:indexPath.row];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if([self isRowSelectedOnTableView:tableView atIndexPath:indexPath]){
        [self.selectedCells removeObject:indexPath];
        [self.selecedStates removeObject:state];
        cell.accessoryType = UITableViewCellAccessoryNone;
    } else {
        [self.selectedCells addObject:indexPath];
        [self.selecedStates addObject:state];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }

    NSLog(@"%@", self.selecedStates);
}


-(BOOL)isRowSelectedOnTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath
{
    return ([self.selectedCells containsObject:indexPath]) ? YES : NO;
}


- (IBAction)selectAll:(id)sender {

    [self.selecedStates removeAllObjects];
    [self.selectedCells removeAllObjects];
    NSUInteger numberOfSections = [self.tableView numberOfSections];
    for (NSUInteger s = 0; s < numberOfSections; ++s) {
        NSUInteger numberOfRowsInSection = [self.tableView numberOfRowsInSection:s];
        for (NSUInteger r = 0; r < numberOfRowsInSection; ++r) {
            NSIndexPath *idxPath = [NSIndexPath indexPathForRow:r inSection:s];
            [self.selectedCells addObject:idxPath];
            [self.selecedStates addObject:self.states[idxPath.row]];
        }
    }
    [self.tableView reloadData];
}



- (IBAction)deselectAll:(id)sender {
    [self.selecedStates removeAllObjects];
    [self.selectedCells removeAllObjects];
    [self.tableView reloadData];
}


- (IBAction)toggleAll:(id)sender {
    if ([self.states count] == [self.selecedStates count]) {
        [sender setTitle:@"select all"];
        [self deselectAll:sender];
    } else {
        [sender setTitle:@"deselect all"];
        [self selectAll:sender];
   }
}

行动中:

enter image description here

您正在致电

[[self.iTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:r inSection:s]] setAccessoryType:UITableViewCellAccessoryNone];

表示tableView中每个部分的每一行。如果你有很多行,这是低效的,因为它将处理不在屏幕上的行。但这不是必需的。只需将每个选定的索引路径放入一个数组,并告诉tableView重新加载。这将重新加载可见单元格,并且由于-tableView:cellForRowAtIndexPath:单元格的实现,新行将被正确地重新配置。

答案 1 :(得分:5)

设置附件视图需要在内部 tableView:cellForRowAtIndexPath:方法中进行。如果要从外部更改附件,外部方法需要首先更改模型以指示必须在某些单元格中放置复选标记,然后在reloadData上调用UITableView

存储检查单元格的一种方法是NSIndexSet个对象数组 - 每个部分有一个索引集。在下面的示例中,我显示了单个部分的代码,但您应该了解如何使多个部分工作。

// This variable needs to be declared in a place where your data source can get it
NSMutableIndexSet *selected;

// You need to initialize it in the designated initializer, like this:
selected = [[NSMutableIndexSet alloc] init];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
    if ([selected containsIndex:indexPath.row]) {
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    } else {
        [cell setAccessoryType:UITableViewCellAccessoryNone];
    }
    // Do the rest of your code
    return cell;
}

现在,在您要设置选定或未选择行的代码中,只需拨打[selected addIndex:rowToSelect][selected removeIndex:rowToUnselect],然后拨打您的表格reloadData

答案 2 :(得分:3)

使用selectRowAtIndexPath:animated:scrollPosition:选择行
deselectRowAtIndexPath:animated:取消选择一行 有关更多信息,请阅读UITableView docs

答案 3 :(得分:2)

尝试使用此代码而不是旧代码

- (IBAction)selectAll:(id)sender
{
    if(myBoolean)
    {
        for (NSInteger s = 0; s < self.iTable.numberOfSections; s++)
        {
            for (NSInteger r = 0; r < [self.iTable numberOfRowsInSection:s]; r++)
            {
              [self.iTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:r inSection:s]] animated:YES scrollPosition:UITableViewScrollPositionNone];

            }
        }

        myBoolean = NO;

        [_selectUnselectButton setTitle:@"Select all Friends" forState:UIControlStateNormal];
    }
    else
    {
        for (NSInteger s = 0; s < self.iTable.numberOfSections; s++)
        {
            for (NSInteger r = 0; r < [self.iTable numberOfRowsInSection:s]; r++)
            {
                 [self.iTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:r inSection:s]] animated:YES scrollPosition:UITableViewScrollPositionNone];
                NSLog(@"%d-%d",s,r);
            }
        }

        myBoolean = YES;

        [_selectUnselectButton setTitle:@"Unselect all Friends" forState:UIControlStateNormal];
    }
}


-(void)tableView:(UITableView *)tableView_ didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView_ cellForRowAtIndexPath:indexPath];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    if (cell.accessoryType == UITableViewCellAccessoryCheckmark)
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
}

答案 4 :(得分:0)

您可以按照以下步骤实现此目的,

1)你应该有一个mutable数组来存储索引路径

2)当您点击全部检查或取消全部选中时,您可以执行addremove所有到/从阵列的索引路径(您已经),重新加载表以进行更新更改

3)在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath数据源方法中,使用if([array containsObject:indexPath])检查数组,如果存在则标记为checkedunchecked

4)在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath委托方法中,您应该检查是否存在已插入数组的索引路径,就像您在第3步中所做的那样,添加删除< / em> indexpaths根据条件,重新加载表进行更新更改

答案 5 :(得分:0)

将另一个NSMutableArray作为 SelectedArray

didSelectRowAtIndexPath行中的

您可以从 SelectedArray 添加删除对象。

您可以选择UITableViewCell来电UITableViews selectRowAtIndexPath方法:

[yourtable selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] 
                       animated:NO 
                 scrollPosition:UITableViewScrollPositionTop];

selectedArray 的循环设置为仅在选定单元格或所有单元格中进行putcheckmark。

在此处查看我接受的答案:Need to create a select all button for UITableView and add selections to an array in iOS

答案 6 :(得分:0)

  • Xcode 8x
  • Swift 3x

    选择行

    let indexPath = IndexPath(row: 0, section: 0)
    mytableView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
    myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)
    

    取消选择行

    let deselectIndexPath = IndexPath(row: 7, section: 0)
    myTableView.deselectRow(at: deselectIndexPath, animated: true)
    myTableView.delegate?.tableView!(tblView, didDeselectRowAt: indexPath)
    
  • 答案 7 :(得分:-1)

    你可以这样做:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        [self doSomethingWithRowAtIndexPath:indexPath];
    }