-1

2つのtableViewの1つにあるセルを削除したい(1つはメイン、2つはお気に入り)。

セルを削除するには、plistでNOになるように、特定の値を「NO」に設定する必要があります(Favoriteテーブルには、「isFav」値がYESに設定されたセルのみが表示されます)。

詳細については、この質問を確認してください:UITableViewに適切なセルが表示されない

私の質問に戻って、私はやろうとしました

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSArray *plist = [self readPlist];
    NSMutableDictionary *theItem = [[[plist objectAtIndex:indexPath.section] valueForKey:@"Rows"] objectAtIndex:indexPath.row]; 
    NSLog(@"%@",theItem);
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [theItem setValue:[NSNumber numberWithBool:NO] forKey:@"isFav"]; 

        [self.tableView deleteRowsAtIndexPaths:[[[NSArray arrayWithObject:[plist objectAtIndex:indexPath.section]]valueForKey:@"Rows"]objectAtIndex:indexPath.row] withRowAnimation:UITableViewRowAnimationNone];

        [self writePlist:plist];   
        [self.tableView reloadData];

    }
}


- (void)writePlist:(NSArray*)arr 
{ 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *plistPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"tipsList.plist"]; 
    NSFileManager *fMgr = [NSFileManager defaultManager]; 
    if ([fMgr fileExistsAtPath:plistPath]) 
        [fMgr removeItemAtPath:plistPath error:nil]; 

    [arr writeToFile:plistPath atomically:YES]; 
}

- (NSArray*)readPlist 
{  
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *plistPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"tipsList.plist"]; 
    NSFileManager *fMgr = [NSFileManager defaultManager]; 
    if (![fMgr fileExistsAtPath:plistPath]) { 
        plistPath = [[NSBundle mainBundle] pathForResource:@"tipsList" ofType:@"plist"]; 

    } 

    NSMutableArray *returnArr = [NSMutableArray arrayWithContentsOfFile:plistPath]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isFav == YES"]; 

    for (NSDictionary *sect in returnArr) { 
        NSArray *arr = [sect objectForKey:@"Rows"]; 
        [sect setValue:[arr filteredArrayUsingPredicate:predicate] forKey:@"Rows"]; 
        [self.tableView reloadData];

    } 
    return returnArr;

}

しかし、成功しませんでした。私がやろうとしていたこと:テーブル内の現在のアイテムにアクセスし、その「isFav」値をNOに設定してから、テーブルからセルを削除しようとしましたが、失敗しました。

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary row]: unrecognized selector sent to instance 0x7fd4ab0'

私はやろうとしまし[NSArray arrayWithObject:indexPath]たが、私は得ます

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

助けていただければ幸いです:|

4

2 に答える 2

1

このエラーは、dataSourceカウントが実際のデータと同じではないために発生します。アイテムを削除すると、tableViewセルがダウンします。10から9まで。しかし、あなたはあなたからデータを削除しなかったdataSourceので、あなたは別のものになってcountしまい、Xcodeはあなたを少し突く。

チャットで(広範に)話したように、このコードで問題を解決しました:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [tableView beginUpdates];

        NSIndexPath *realIndex = [self realIndexPathForIndex:indexPath];
        NSArray *plist = [self readFullPlist];

        NSMutableDictionary *theItem = [[[plist objectAtIndex:realIndex.section] valueForKey:@"Rows"] objectAtIndex:realIndex.row];
        [theItem setValue:[NSNumber numberWithBool:NO] forKey:@"isFav"];
        [self writePlist:plist];

        [self refreshTable];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [tableView endUpdates];
    }
}

- (NSArray*)readFullPlist
{
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *plistPath = [[documentPaths lastObject] stringByAppendingPathComponent:@"tipsList.plist"]; 
    NSFileManager *fMgr = [NSFileManager defaultManager]; 
    if (![fMgr fileExistsAtPath:plistPath]) { 
        NSString *bundlePlistPath = [[NSBundle mainBundle] pathForResource:@"tipsList" ofType:@"plist"];
        [self writePlist:[NSArray arrayWithContentsOfFile:bundlePlistPath]];
    }

    return [NSArray arrayWithContentsOfFile:plistPath];
}

- (NSIndexPath*)realIndexPathForIndex:(NSIndexPath*)idxPath
{
    NSArray *fullList = [self readFullPlist];
    NSArray *subArr = [[fullList objectAtIndex:idxPath.section] objectForKey:@"Rows"];

    int row = idxPath.row;
    int newRow = 0;

    for (NSDictionary *dic in subArr)
    {
        if ([[dic valueForKey:@"isFav"] boolValue]) {
            if (row == 0) {
                return [NSIndexPath indexPathForRow:newRow inSection:idxPath.section];
            }
            row--;
        }
        newRow++;
    }
    return idxPath;
}
于 2012-06-29T00:10:32.057 に答える
0

tableView:commitEditingStyle:メソッドで、tableViewの行を削除するステートメントを検索します。ここでは、NSIndexPathsを使用して配列を渡す必要があります。この行にはネストされた呼び出しが多数含まれているため、スニペットで読み取るのは非常に困難です...

于 2012-06-27T15:52:13.007 に答える