2011-07-28 2 views
0

実際にはショッピングカートがあり、「カートからアイテムを削除する」機能を追加したいと考えています。しかし、テーブル行から項目を削除しようとすると例外が発生します。私の理解としては、それは私の配列の初期化と関連しています。以下は例外と関連するコードです。NSExecptionは、UITableViewの行を削除しようとしています。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x4c45b00' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x00ecc5a9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x01020313 objc_exception_throw + 44 
    2 CoreFoundation      0x00ece0bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x00e3d966 ___forwarding___ + 966 
    4 CoreFoundation      0x00e3d522 _CF_forwarding_prep_0 + 50 
    5 JewleryShop       0x0000f7c8 -[BasketTableViewController tableView:commitEditingStyle:forRowAtIndexPath:] + 158 
    6 UIKit        0x00427037 -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] + 101 
    7 UIKit        0x003bc4fd -[UIApplication sendAction:to:from:forEvent:] + 119 
    8 UIKit        0x0044c799 -[UIControl sendAction:to:forEvent:] + 67 
    9 UIKit        0x0044ec2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527 
    10 UIKit        0x0044d7d8 -[UIControl touchesEnded:withEvent:] + 458 
    11 UIKit        0x003e0ded -[UIWindow _sendTouchesForEvent:] + 567 
    12 UIKit        0x003c1c37 -[UIApplication sendEvent:] + 447 
    13 UIKit        0x003c6f2e _UIApplicationHandleEvent + 7576 
    14 GraphicsServices     0x01824992 PurpleEventCallback + 1550 
    15 CoreFoundation      0x00ead944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
    16 CoreFoundation      0x00e0dcf7 __CFRunLoopDoSource1 + 215 
    17 CoreFoundation      0x00e0af83 __CFRunLoopRun + 979 
    18 CoreFoundation      0x00e0a840 CFRunLoopRunSpecific + 208 
    19 CoreFoundation      0x00e0a761 CFRunLoopRunInMode + 97 
    20 GraphicsServices     0x018231c4 GSEventRunModal + 217 
    21 GraphicsServices     0x01823289 GSEventRun + 115 
    22 UIKit        0x003cac93 UIApplicationMain + 1160 
    23 JewleryShop       0x00002934 main + 102 
    24 JewleryShop       0x000028c5 start + 53 
) 
terminate called after throwing an instance of 'NSException' 
Program received signal: “SIGABRT”. 

//When my basket gets the data. 
NSMutableDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
    if (dict) 
    { 
     //basketArray = [[NSMutableArray alloc] initWithObjects:nil]; 
     basketArray = [[dict objectForKey:@"myCartItems"] retain]; 
    } 
//Code for deleting the table row data 
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView 
      editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSUInteger row = [indexPath row]; 
    NSUInteger count = [basketArray count]; 

    if (row < count) { 
     return UITableViewCellEditingStyleDelete; 
    } else { 
     return UITableViewCellEditingStyleNone; 
    } 
} 

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

    NSUInteger row = [indexPath row]; 
    NSUInteger count = [basketArray count]; 

    if (row < count) { 
     NSLog(@"row value is : %i",row); 

     [basketArray removeObjectAtIndex:row]; 
    } 
} 
- (void)tableView:(UITableView *)tableView 
didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { 


    [tableView reloadData]; 
} 
+0

の代わりにしようとは思われます。あなたはNSMutableArrayとして初期化する必要があります – EmilioPelaez

答えて

0

オブジェクトを削除しようとしているときにあなたが例外で見ることができるよう、あなたのbasketArrayは、実際にはNSMutableArrayのではありません。それはremoveObjectAtIndex:に応答しないNSArrayです。 basketArrayが変更可能と思われる場合は、どこを変更可能にして、実際に実行されているかを確認してください。

+0

私はあなたに同意するが、basketArrayは変更可能ですが、私はそれが初期化で問題を抱えていると私はそれを解決できないと思う。 –

+0

JSONデシリアライザから取得した値をbasketArrayに代入する場合は、それを変更できません。また、すでにbasketArrayに割り当てられている変更可能な配列もリークしています。 –

+0

はいJSONデシリアライザからbasketArrayに値を取得しています。これらの値を変更可能にする方法を教えてください。 –

0
basketArray = [[NSMutableArray alloc] initWithObjects:nil]; 
basketArray = [[dict objectForKey:@"myCartItems"] retain]; 

あなたは配列を割り当てて、その辞書から取得するオブジェクトに何かを即座に設定します。私は起こっていることは、あなたが辞書から掴んでいるオブジェクトが実際にはnsarrayであると思います。 basketArrayはNSArrayのある、そしてあなたはそれからオブジェクトを削除することはできませんように

これら二つのライン

basketArray = [NSMutableArray arrayWithArray:[dict objectForKey:@"myCartItems"]]; 
関連する問題