UITableView上显示多个附件复选标记

时间:2013-03-12 11:08:03

标签: iphone ios objective-c uitableview

我有一个UITableView,当选择一行时显示复选标记。问题是当表视图滚动时,只有一个行被选中时会显示多个复选标记。当表滚动并出现出队过程时出现问题。这是我的cellForRowAtIndexPath:方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MainCell"];

        cell.selectedBackgroundView = [[UIView alloc] initWithFrame:CGRectZero];

        cell.selectedBackgroundView.backgroundColor = [UIColor colorWithRed:204.0/255.0 green:56.0/255.0 blue:55.0/255.0 alpha:1];

    }

    // Get item from tableData
    NSDictionary *item = (NSDictionary *)[displayItems objectAtIndex:indexPath.row];

    cell.textLabel.text = [item objectForKey:@"key"];

    [cell.textLabel setFont:[UIFont fontWithName: @"Asap-Bold" size: 14.0f]];

    return cell;
}

和didSelect方法:

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    selectedCityTableString = cell.textLabel.text;

    cellAccessoryImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon-tick.png"]] ;
    cellAccessoryNoneImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@""]] ;

    if (cell.accessoryType==UITableViewCellAccessoryNone)
    {
        //        cell.accessoryType=UITableViewCellAccessoryCheckmark;

        cell.accessoryView = cellAccessoryImageView;

        if (prev!=indexPath.row) {
            cell=[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:prev inSection:0]];
            //cell.accessoryType=UITableViewCellAccessoryNone;
            cell.accessoryView = cellAccessoryNoneImageView;

            prev=indexPath.row;
        }
    }
    else{
        //        cell.accessoryType=UITableViewCellAccessoryNone;
        cell.accessoryView = cellAccessoryNoneImageView;

    }

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

    NSString *mutCityStr = [[selectedCityTableString stringByReplacingOccurrencesOfString:@" " withString:@"+"] lowercaseString];

   // NSString *mutCityStr = @"c";

    [prefs setObject:mutCityStr forKey:@"selectedCityTableString"];
    [prefs synchronize];

#ifdef DEBUG    
    NSLog(@"mutCityStr is %@",mutCityStr);
    NSLog(@"selectedCityTableString is %@",selectedCityTableString);
    NSLog(@"posting notification from TWO TABLES");
#endif

    [[NSNotificationCenter defaultCenter] postNotificationName:@"TTSelectedList" object:selectedCountryTableString];

}

4 个答案:

答案 0 :(得分:3)

假设您有一个名为selectedRow的属性(属性),请使用此方法的组合:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...

    if (indexPath.row == self.selectedRow) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // If there is a cell selected deselect
    if (self.selectedRow != NSNotFound) {
        NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:self.selectedAQIType inSection:0];
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:previousIndexPath];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    // Select the touched cell
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    self.selectedRow = indexPath.row;
}

答案 1 :(得分:2)

在你的.h文件中

int selectedRow;

在你的.m文件中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
        // your other code for cell init,etc
        int row = [indexPath row];
        cell.accessoryType = (row == selectedRow) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

        cell.textLabel.textColor= (row == selectedRow) ? [UIColor colorWithRed:242.0f/255.0f green:104.0f/255.0f blue:42.0f/255.0f alpha:1] : [UIColor blackColor] ;

}

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

    selectedRow = [indexPath row];
    [tableView reloadData];
}

希望这有帮助!!!

答案 2 :(得分:0)

UITableView的委托方法- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath根据reuseidentifier重用单元格。因此,您需要将整个单元格内容重置为默认值。

在您的情况下,在返回单元格之前取消选中单元格的视图。

答案 3 :(得分:0)

要解决此问题,请将选定的行索引存储在一个 NSArray 中。 (在 didSelectRowAtIndexPath 方法中)

cellForRowAtIndexPath 方法中,检查 indexPath.row 是否在该数组中可用,然后启用复选标记,否则禁用。

注意:维护数组以进行check-uncheck事件

希望这会对你有所帮助。