4

セルを選択して配列にデータを追加するtableViewがあります。また、特定のセルをスワイプして削除し、最終的に配列からデータを削除するオプションもあります。

問題は、行を削除すると、テーブルをリロードした後にすべての選択状態が失われることです。

そのために、選択配列をもう一度チェックして、これらすべてのセルを再選択しました。

しかし、セルを実際に削除してtableViewをリロードするずっと前に、セルをスワイプするとすぐに、他のすべてのセルの選択状態も消えてしまいます。

注: 2 つの配列があります。1 つは tableView に表示される項目のリストを含み、もう 1 つは選択された項目を含みます。

ここにいくつかのコードがあります:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 50;  
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.contactList count];
}

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

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
    }

    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    [cell.textLabel setTextColor:[UIColor colorWithRed:103.0/255.0 green:103.0/255.0 blue:103.0/255.0 alpha:1.0]];
    [cell.textLabel setFont:[UIFont fontWithName:@"ITCAvantGardeStd-Bk" size:14.0]];

    if (![[[self.contactList objectAtIndex:indexPath.row] objectForKey:@"nickName"] isEqualToString:@""])
        cell.textLabel.text = [NSString stringWithFormat:@"%@",[[self.contactList objectAtIndex:indexPath.row] objectForKey:@"nickName"]];

    else
        cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",[[self.contactList objectAtIndex:indexPath.row] objectForKey:@"firstName"],[[self.contactList objectAtIndex:indexPath.row] objectForKey:@"lastName"]];

    return cell;


}

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

    NSLog(@"Selected cell index==>%d\n",indexPath.row);
    //NSString *emailID = [NSString stringWithFormat:@"%@",[[self.contactList objectAtIndex:indexPath.row] objectForKey:@"email_key"]];
    NSLog(@"emailID==>%@\n",[self.contactList objectAtIndex:indexPath.row]);    
    [self.emailShareList addObject:[self.contactList objectAtIndex:indexPath.row]];
    //[self.emailShareList insertObject:emailID atIndex:indexPath.row];
    NSLog(@"Array value==>%@\n",self.emailShareList);
    //[tableView deselectRowAtIndexPath:indexPath animated:YES];
}


- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"deSelected cell index==>%d\n",indexPath.row);
    NSString *emailID = [NSString stringWithFormat:@"%@",[[self.contactList objectAtIndex:indexPath.row] objectForKey:@"email_key"]];
    NSLog(@"emailID==>%@\n",emailID);   

    [self.emailShareList removeObject:[self.contactList objectAtIndex:indexPath.row]];
    NSLog(@"deSelect row Array value==>%@\n",self.emailShareList);
}


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        if(indexPath.row != 0)
        {
            NSString *contactID = [[self.contactList objectAtIndex:indexPath.row] objectForKey:@"contactId"];
            NSLog(@"content on delete row==>%@\n",contactID);
            [self.contactList removeObjectAtIndex:indexPath.row];
            [self deleteContactToServer:contactID];
        }
    }

    [contactTableView reloadData];
    for (int i = 0; i < [self.emailShareList count]; i++) 
    {
        for (int j = 0; j < [self.contactList count]; j++) 
        {
            if([[[self.contactList objectAtIndex:j] valueForKey:@"email"]   isEqualToString:         [[self.emailShareList objectAtIndex:i] valueForKey:@"email"]])
            {
                NSIndexPath *path1 = [NSIndexPath indexPathForRow:j inSection:0];
                [contactTableView selectRowAtIndexPath:path1 animated:NO scrollPosition:UITableViewScrollPositionNone];
            }
        }    
    }
}


- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{




    UITableViewCellEditingStyle style = UITableViewCellEditingStyleNone;

    if(indexPath.row != 0)
        style = UITableViewCellEditingStyleDelete;


    return style;
}
4

2 に答える 2

5

項目を削除する場合、テーブルビュー全体を再読み込みする必要はありません。–deleteRowsAtIndexPaths:withRowAnimation: メソッドを使用して、問題のセルを削除することができます (それに応じたモデルの更新と共に)。これにより、おそらく選択が保持されます。

編集モードに入ったときに選択を保持するには (削除のためのスワイプも編集モードの特殊なケースです)、次の 2 つのことを行う必要があります。

まず、tableView で allowSelectionDuringEditing を有効にします。

self.tableView.allowsSelectionDuringEditing = YES;

次に、UITableView サブクラスを作成し、次のように setEditing:animated: をオーバーライドします。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    NSArray *indexPaths = self.indexPathsForSelectedRows;
    [super setEditing:editing animated:animated];
    for (NSIndexPath *ip in indexPaths) {
        [self selectRowAtIndexPath:ip animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
}

個人的には、モデルの観点から選択が重要な場合は、何らかのカスタム選択メカニズムを使用したいと思います。カスタム セル サブクラスを作成し、そこに選択プロパティを追加して、それに応じてセル スタイルを変更します。通常のテーブル ビューの選択に影響を与える組み込み機能は、このようなアプローチで問題を引き起こすことはありません。

于 2012-08-22T12:04:50.160 に答える
0

UITableView をサブクラス化せずに、編集モードの内外でテーブルの選択を保持する追加の方法を次に示します。以下を UITableViewControllerView に追加します。

viewDidLoad 内に以下を追加します。

self.tableView.allowsSelectionDuringEditing = YES;

次に、setEditing:animated: をオーバーライドします。

- (void)setEditing:(BOOL)editing animated:(BOOL)animate
{
    NSArray *selectedIndexPaths = [self.tableView indexPathsForSelectedRows];

    [super setEditing:editing animated:animate];

    for (NSIndexPath *selectedIndexPath in selectedIndexPaths) {
        [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    }
}
于 2014-07-01T00:27:19.893 に答える