2012-07-20 100 views
0

我有點新Objective-C,所以我一直在學習頭第一個iPhone & iPad開發書。在本書中,在第4-5章中,你會設計一個調酒師的應用程序,它基本上是一張帶詳細列表的飲料列表的表格視圖(它假設所選飲料的成分和方向)。數據來自兩個屬性列表,一個列表中包含飲料名稱的字符串列表,另一個列表中包含飲料名稱,方向和成分的字典。「飲料攪拌機」示例頭第一個iPhone和iPad開發

我跟着教程和應用程序崩潰,重新檢查它,仍然崩潰。我使用4.0.1的Xcode版本和MAC OS X 10.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:@「名」

- (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; 

} 

回答

2

錯誤的第一行的線索就是你已經初始化的內容self.drinks在與indexPath.row對應的索引處爲NSString。當檢索到objectAtIndex:時,它會傳遞消息objectForKey:就像它是NSArray一樣。

看看你已經初始化self.drinks的代碼,並確定你已經做了一個適當的數組,包含適當的內容。在你的情況下,它將是一個NSDictionary * for objectForKey的數組:工作)。

+0

@robmayoff感謝您的錯誤。我已經編輯了答案。 (如果你已經編輯過它,我會批准它的。) – 2012-07-20 03:42:02

+0

謝謝John!,我沒有更新新plist的路徑(這是替代「舊」的路徑),我有那個Dictionary-String內容問題 – iDaniel89 2012-07-20 14:42:40

0

調試你的代碼,檢查飲料是一個NSDictonary數組。