0

こんにちは、ありがとうございます。ユーザーがセクション ビューに変更できるテーブル ビューがあります。標準ビューではすべて問題ありませんが、ユーザーがセクション ビューに切り替えると、(-commitEditingStyle:) 関数で行を削除しようとするとクラッシュします。この関数には何が欠けていますか? 行が分割されている場合、行を削除するにはどうすればよいですか? (配列の辞書であるplistからテーブルをロードします。各インデックスはテーブルビューの行です。)

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
     if ([strTitle isEqualToString:@"sectionView"]) {

         @try {


         if (editingStyle == UITableViewCellEditingStyleDelete) {
             // Delete the row from the data source.
           //  NSMutableDictionary *book =[[NSMutableDictionary alloc]init];
             NSMutableDictionary *mynewList = [[NSMutableDictionary alloc]init];
             mynewList = [[self.TitleDis valueForKey:[[[self.TitleDis allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
             NSMutableArray *sectionRow = [mynewList objectForKey:@"Dis"];


             [sectionRow removeObjectAtIndex:indexPath.row];

             [mynewList writeToFile:[self dataFilePath] atomically:YES];

             //
             [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

         } else if (editingStyle == UITableViewCellEditingStyleInsert) {
             // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
         }   
         }
         @catch (NSException *exception) {
             NSLog(@"hello error...%@",exception);
         }



     }

     else {
    /////////////////////// STANDARD VIEW 

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source.
        [distribArray removeObjectAtIndex:indexPath.row];
        //
        //        NSMutableArray *contents = [[NSMutableArray alloc] init];
        //        [contents addObject:myMasterList];
        //        //[contents addObject:[NSArray arrayWithObjects:arraydata.text,distroName.text,destorEmail.text, nil]];

        [distribArray writeToFile:[self dataFilePath] atomically:YES];

        //
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }   
         //////////////////////////////////
     }
}

コンソール: -[__NSCFString removeObjectAtIndex:]: 認識されないセレクターがインスタンス 0xe4bd3f0 に送信されました

ご覧のとおり、私はフォーマットをいじっています....次に何を試せばよいかわかりません??? ありがとう。

セクション化の意味:ここに画像の説明を入力

4

2 に答える 2

0

したがって、1つには、次のものがあります。

NSMutableDictionary *mynewList = [[NSMutableDictionary alloc]init];
mynewList = [[self.TitleDis valueForKey:[[[self.TitleDis allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];

mynewListを割り当てて、すぐに上書きします。

ただし、デバッガーでsectionRowのタイプを確認する必要があると思います。私の推測では、それはNSStringだと思います。

データ構造についてもう少し知らなければ、何が起こっているのかを知るのはかなり難しいです。

于 2012-10-23T18:56:18.263 に答える
0

Two problems are here. The below line will create a leak and should not be used in this way.

NSMutableDictionary *mynewList = [[NSMutableDictionary alloc]init];
             mynewList = [[self.TitleDis valueForKey:[[[self.TitleDis allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];

Instead of this you can put it as,

NSMutableDictionary *mynewList = [[self.TitleDis valueForKey:[[[self.TitleDis allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];

Another thing is,

[mynewList objectForKey:@"Dis"]; is not always an array and it is sometimes coming as string. Check your data structure and confirm if it is an array.

Try like this,

id obj = [mynewList objectForKey:@"Dis"];
NSLog(@"%@", [[obj class] description]);

and check what is the data type of obj printed in NSLog. Confirm it is NSMutableArray and not NSString.

于 2012-10-23T19:24:43.110 に答える