2008-09-05 132 views
18

我正在寫我的第一個iPhone應用程序,所以我沒有得到解決調試的方式。 本質上,我的應用程序顯示圖像,並在觸摸時播放短暫的聲音。 在XCode中編譯和構建項目時,一切都會成功完成,但是當應用程序在iPhone模擬器中運行時,它會崩潰。iPhone應用程序崩潰與NSUnknownKeyException setValue:forUndefinedKey:

我得到以下錯誤:這裏

Application Specific Information: 
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331) 
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.' 

kramerImage是我使用的背景圖像。

我不確定NSUnknownKeyException意味着什麼或者爲什麼這個類不是密鑰的密鑰值。

回答

22

(這不是真正的iPhone特定 - 同樣的事情會發生在普通的可可)。

NSUnknownKeyException是使用Key-Value Coding訪問該對象不具有的密鑰時的常見錯誤。

大多數可可對象的屬性可以直接訪問:

[@"hello world" length] // Objective-C 1.0 
@"hello world".length  // Objective-C 2.0 

或通過鍵 - 值編碼:

[@"hello world" valueForKey:@"length"] 

如果我用下面這行我會得到一個NSUnknownKeyException:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"] 

因爲NSString沒有名爲'purpleMonkeyDishwasher'的屬性(鍵)。

你的代碼中的某些東西試圖爲UIView上的鍵「kramerImage」設置一個值,該鍵顯然不支持該鍵。如果你使用的是界面生成器,它可能是你的筆尖的東西。

找到正在使用'kramerImage'的地方,並嘗試從那裏追蹤它。

+2

我得到這個錯誤,這是與interfacebuilder做的事情,但我不知道如何解決它。 – bentford 2008-09-24 23:58:36

+1

非常感謝 - 另外浪費了3個小時終於修好了。 :) – 2010-08-03 16:40:35

+0

我在將文件從一個項目複製到另一個項目的情況下遇到了這個問題。我的xib提到錯誤的類名。這個答案爲我提供了足夠的信息,因此謝謝。 – Grumdrig 2010-08-24 21:37:07

10

此外,當您重命名視圖時,不要忘記刪除文件所有者的引用。它也可能引發這個錯誤。

8

這裏有一個你會得到這個錯誤 - 以及如何解決它。加載一個只有自定義TableViewCell的筆尖時,我得到它。我使用IB來構建一個只有文件所有者,第一響應者和TableViewCell的xib。 TableViewCell只有4個UILabel,它們與4個名爲rootCell的IBOutlet UILabel相匹配。我將TableViewCell的類更改爲rootCell。它工作得很好,直到做了一些改動,突然我得到了setValue方法:forUndefinedKey:當我從筆尖加載它後,只是實例化類:

NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil]; 

    cell = [nib objectAtIndex:0]; 

它未能在第一線,當筆尖試圖加載。過了一會兒,我發現它試圖將IBOutlet標籤與根控制器相匹配,而不是rootCell類!這是我的迴應。我做錯了什麼是無意中將文件所有者更改爲rootCell類。當我將其更改回NSObject時,它在加載時沒有嘗試匹配委託(rootController)。所以,如果你正在做上面的事情,把File的Owner作爲一個NSObject,但是讓UITableCell成爲你想要的類。

0

似乎你是合成的ImageView,後做

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *InitialkramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage; 

那麼當你在Interface Builder中打開「MyFirstIphoneAppViewController.xib」,你正在從工具(菜單)的形象圖/庫書房連接的是來自「MyFirstIphoneAppViewController.xib」文件所有者的「InitialkramerImage」插座。然後你保存了這個項目。但在此之後,您可能會將插座變量「InitialkramerImage」的名稱更改爲「kramerImage」。那麼,這樣做

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *kramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage; 

和保存,當你運行該項目後,有沒有「InitialkramerImage」中的「MyFirstIphoneAppViewController.xib」出口的所有腦幹。所以,當你運行該項目不會有出路從引用的ImageView的「kramerImage」和

"For displaying the view, UIViewController will try to find the outlet to "InitialkramerImage" which is not existing."

所以,這將引發「NSUnknownKeyException」。

You can check the missing outlet by opening the nib(.xib) file then right clicking on the 'Files Owner' of that.

2

我今天有這個問題。我的導航控制器中沒有爲View Controller指定的類。如果您無法在Interface Builder中爲您的視圖指定正確的類,則會經常發生這種情況。

您也會遇到無效的選擇器問題。總是檢查你的Interface Builder類和連接!

0

如果您在其他地方完成了此代碼並且有zip /壓縮文件,請嘗試再次提取它。它可能工作我不知道爲什麼,但我覺得這是一個提取問題。

或者您可以嘗試將IBOutlet更改爲kramerImage並在NIB中重新綁定它。

2

我有這種情況,事實證明,即使找到變量的所有實例並刪除它們,我的應用程序仍然崩潰。繼承人發生了什麼......我從XIB的textfield中創建了另一個變量實例到我的viewController.h中,但是我意識到我不再需要它並將其刪除。事實證明,我的程序看到了它,並一直試圖在程序中使用它,如果這發生在其他任何地方,只要進入你的XIB,右鍵單擊按鈕或文本字段等,並刪除任何額外的未使用的變量。

2

這是我如何解決我的,在界面生成器中右鍵單擊視圖控制器,應該有缺少的插座或操作方法上的感嘆號。找到並刪除所有的參考,並解決它。

發生這種情況是因爲我刪除了.m文件中的操作方法。