0

行が選択されたときにチェックマークを表示するUITableViewがあります。問題は、テーブルビューがスクロールすると、行が1つだけ選択されたときに、複数のチェックマークが表示されることです。この問題は、テーブルがスクロールし、デキュープロセスが発生するときに発生します。これが私の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

4 に答える 4

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;
}
于 2013-03-12T11:15:09.470 に答える
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];
}

お役に立てれば!!!

于 2013-03-12T11:24:26.547 に答える
0

UITableViewのdelegateメソッド- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathは、reuseidentifierに基づいてセルを再利用します。したがって、セルの内容全体をデフォルトにリセットする必要があります。

あなたの場合、セルを返す前にセルのビューのチェックを外してください。

于 2013-03-12T11:10:42.253 に答える
0

この問題を解決するには、選択した行インデックスを1つに格納しますNSArray。(didSelectRowAtIndexPath方法で)

そして、cellForRowAtIndexPathメソッドで、indexPath.rowその配列で使用可能かどうかを確認してから、チェックマークを有効にします。それ以外の場合は無効にします。

注:check-uncheckイベントの配列を維持します

これがお役に立てば幸いです。

于 2013-03-12T11:14:27.080 に答える