0

私はObjective-Cに少し慣れていないので、Head First iPhone&iPadDevelopmentの本で学んでいます。この本では、第4-5章で、バーテンダー向けのアプリを設計することを想定しています。これは、基本的に、詳細リストを含む飲み物のリストのテーブルビューです(飲み物の材料と方向が選択されていることを前提としています)。データは2つのプロパティリストから取得されます。1つは飲み物の名前が記載された文字列のリストで、もう1つは飲み物の名前、方向、材料が記載された辞書です。

チュートリアルに従いましたが、アプリがクラッシュし、再確認してもクラッシュします。Xcodeバージョン4.0.1とMACOSX10.6.8を使用しています。

ここに例外があります、私はあなたたちがこの単純なアプリケーションで何が起こるかをチェックできることを願っています。

2012-07-19 21:43:39.757 DrinkMixer[846:207] -[NSCFString objectForKey:]: unrecognized selector sent to instance 0x4b31220

2012-07-19 21:43:39.761 DrinkMixer[846:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectForKey:]: unrecognized selector sent to instance 0x4b31220'

    *** Call stack at first throw:

    (

    0   CoreFoundation                      0x00dc25a9 __exceptionPreprocess + 185

    1   libobjc.A.dylib                     0x00f16313 objc_exception_throw + 44

    2   CoreFoundation                      0x00dc40bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187

    3   CoreFoundation                      0x00d33966 ___forwarding___ + 966

    4   CoreFoundation                      0x00d33522 _CF_forwarding_prep_0 + 50

    5   DrinkMixer                          0x00002495 -[RootViewController tableView:cellForRowAtIndexPath:] + 325

    6   UIKit                               0x00089b98 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634

    7   UIKit                               0x0007f4cc -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75

    8   UIKit                               0x000948cc -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561

    9   UIKit                               0x0008c90c -[UITableView layoutSubviews] + 242

    10  QuartzCore                          0x016aca5a -[CALayer layoutSublayers] + 181

    11  QuartzCore                          0x016aeddc CALayerLayoutIfNeeded + 220

    12  QuartzCore                          0x016540b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310

    13  QuartzCore                          0x01655294 _ZN2CA11Transaction6commitEv + 292

    14  UIKit                               0x000169c9 -[UIApplication _reportAppLaunchFinished] + 39

    15  UIKit                               0x00016e83 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 690

    16  UIKit                               0x00021617 -[UIApplication handleEvent:withNewEvent:] + 1533

    17  UIKit                               0x00019abf -[UIApplication sendEvent:] + 71

    18  UIKit                               0x0001ef2e _UIApplicationHandleEvent + 7576

    19  GraphicsServices                    0x00ffb992 PurpleEventCallback + 1550

    20  CoreFoundation                      0x00da3944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52

    21  CoreFoundation                      0x00d03cf7 __CFRunLoopDoSource1 + 215

    22  CoreFoundation                      0x00d00f83 __CFRunLoopRun + 979

    23  CoreFoundation                      0x00d00840 CFRunLoopRunSpecific + 208

    24  CoreFoundation                      0x00d00761 CFRunLoopRunInMode + 97

    25  UIKit                               0x000167d2 -[UIApplication _run] + 623

    26  UIKit                               0x00022c93 UIApplicationMain + 1160

    27  DrinkMixer                          0x00001c89 main + 121

    28  DrinkMixer                          0x00001c05 start + 53

    )

    terminate called after throwing an instance of 'NSException'

    sharedlibrary apply-load-rules all

    (gdb) 

そして、これがまさにアプリがクラッシュしたときのobjectForKey:@ "name"

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

{

    static NSString *CellIdentifier = @"Cell";



    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    }

    cell.textLabel.text = [[self.drinks objectAtIndex:indexPath.row] objectForKey:@"name"];

    return cell;

}
4

2 に答える 2

2

エラーの最初の行の手がかりは、indexPath.rowに対応するインデックスでself.drinksの内容をNSStringに初期化したことです。そのobjectAtIndex:が取得されると、NSArrayであるかのようにメッセージobjectForKey:が渡されます。

self.drinksを初期化したコードを見て、適切なコンテンツを含む適切な配列になっていることを確認してください。あなたの場合、それはobjectForKey:が機能するためのNSDictionary*の配列になります。

于 2012-07-20T03:35:50.737 に答える
0

コードをデバッグし、飲み物が NSDictonary の配列であることを確認します。

于 2012-07-20T08:07:54.320 に答える