2008-09-05 19 views
18

Tôi đang viết ứng dụng iPhone đầu tiên của mình, vì vậy tôi đã không nhận được xung quanh để tìm ra nhiều trong cách gỡ lỗi. Về cơ bản ứng dụng của tôi hiển thị hình ảnh và khi chạm vào sẽ phát một âm thanh ngắn. Khi biên dịch và xây dựng dự án trong XCode, mọi thứ đều được xây dựng thành công, nhưng khi ứng dụng được chạy trong trình giả lập iPhone, nó bị treo.Ứng dụng iPhone bị lỗi với NSUnknownKeyException setValue: forUndefinedKey:

tôi nhận được lỗi sau:

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 đây là hình ảnh tôi đang sử dụng cho nền.

Tôi không chắc NSUnknownKeyException có nghĩa là gì hoặc tại sao lớp không phải là khóa mã hóa tuân thủ giá trị khóa.

Trả lời

22

(Điều này không thực sự là iPhone cụ thể - điều tương tự sẽ xảy ra trong Cocoa thông thường).

NSUnknownKeyException là lỗi phổ biến khi sử dụng Key-Value Coding để truy cập khóa mà đối tượng không có.

Các tính chất của hầu hết các đối tượng Cocoa có thể được truy cập trực tiếp:

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

Hoặc qua Key-Value Coding:

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

tôi sẽ nhận được một NSUnknownKeyException nếu tôi sử dụng dòng sau:

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

vì NSString không có thuộc tính (khóa) được gọi là 'purpleMonkeyDishwasher'.

Nội dung nào đó trong mã của bạn đang cố đặt giá trị cho khóa 'kramerImage' trên UIView, cái mà (dường như) không hỗ trợ khóa đó. Nếu bạn đang sử dụng Trình tạo giao diện, nó có thể là thứ gì đó trong nib của bạn.

Tìm vị trí 'kramerImage' đang được sử dụng và cố gắng theo dõi nó từ đó.

+2

Tôi gặp phải lỗi này và đó là điều cần làm với interfacebuilder, nhưng tôi không thể tìm ra cách khắc phục. – bentford

+1

Cảm ơn vì điều đó - 3 giờ lãng phí khác cuối cùng đã được sửa. :) –

+0

Tôi đã gặp sự cố này trong trường hợp tôi đã sao chép tệp từ dự án này sang dự án khác. Xib của tôi gọi tên lớp sai. Câu trả lời này đã cho tôi đủ thông tin cho một thời điểm eureka, vì vậy cảm ơn. – Grumdrig

10

Ngoài ra khi bạn đổi tên chế độ xem, đừng quên xóa tham chiếu trên Chủ sở hữu tệp. Nó cũng có thể làm tăng lỗi này.

+1

+1 điều này đã xảy ra với tôi . Tôi đổi tên biến cho MKMapView của tôi và tất cả BAM đột ngột! NSUknownUknownKeyException. – ladookie

+0

Bảng phân cảnh có một nút được liên kết đến không có gì gây ra lỗi KeyValue. Điều này giải quyết được vấn đề của tôi. Cảm ơn! –

8

Đây là nơi bạn sẽ gặp phải lỗi này - và cách khắc phục. Tôi đã nhận được nó khi tải một ngòi chỉ có một TableViewCell tùy chỉnh. Tôi đã sử dụng IB để xây dựng một xib chỉ có Chủ sở hữu tệp, Người trả lời đầu tiên và TableViewCell. TableViewCell chỉ có 4 UILabels phù hợp với một lớp với 4 IBOutlet UILabels được gọi là rootCell. Tôi đã thay đổi lớp của TableViewCell thành rootCell. Nó hoạt động tốt cho đến khi một thực hiện một vài thay đổi và đột nhiên tôi đã nhận được setValue: forUndefinedKey: khi tôi đã chỉ instantiating lớp sau khi tải nó từ một ngòi:

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

    cell = [nib objectAtIndex:0]; 

nó thất bại ở dòng đầu tiên, khi nib đang cố gắng tải. Sau một thời gian, tôi nhận thấy rằng nó đã cố gắng để phù hợp với các nhãn IBOutlet để điều khiển gốc, không phải là lớp rootCell! Đó là tipoff của tôi. Những gì tôi đã làm sai là vô tình thay đổi chủ sở hữu của File thành lớp rootCell. Khi tôi thay đổi nó trở lại NSObject, sau đó nó đã không cố gắng để phù hợp với các đại biểu (rootController) khi tải. Vì vậy, nếu bạn đang làm như trên, hãy tạo cho Chủ sở hữu tệp một NSObject, nhưng làm cho UITableCell trở thành lớp bạn muốn.

+0

+1 Và lưu ý đến bản thân mình và bất kỳ ai khác _always_ quên điều này: khi sử dụng loadNibNamed: owner: options :, Chủ sở hữu tệp phải là NSObject, chế độ xem chính phải là loại lớp của bạn và tất cả các cửa hàng phải được nối vào chế độ xem , _not_ Chủ sở hữu tệp. – Echelon

+0

Cảm ơn Owen, tôi đã vật lộn với hoàn cảnh chính xác. Đã giải quyết như được mô tả. Cảm ơn rất nhiều! – Khiet

0

Có vẻ như bạn đang làm

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

Sau đó, sau khi tổng hợp mà ImageView, Khi bạn mở "MyFirstIphoneAppViewController.xib" trong giao diện Builder, bạn đang dùng một Xem hình từ Tool (menu)/Library den liên kết đó đầu ra 'InitialkramerImage' từ Chủ sở hữu tệp của "MyFirstIphoneAppViewController.xib". Sau đó, bạn đã lưu dự án. Nhưng sau đó bạn có thể thay đổi tên của biến outlet "InitialkramerImage" thành "kramerImage". Vì vậy, sau khi làm điều này

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

và lưu dự án khi bạn chạy nó, không có sự tồn tại của các cửa hàng của "InitialkramerImage" trong "MyFirstIphoneAppViewController.xib". Vì vậy, khi bạn chạy dự án sẽ không có lối thoát tham khảo từ IMAGExem đến 'kramerImage' và

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

Vì vậy, Nó sẽ ném "NSUnknownKeyException".

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

2

Tôi đã có cùng một vấn đề này ngay hôm nay. Tôi không có lớp thích hợp được chỉ định cho Trình điều khiển Chế độ xem trong Trình điều khiển Điều hướng của tôi. Điều này sẽ xảy ra thường xuyên nếu bạn không chỉ định đúng lớp cho các chế độ xem của mình trong Trình tạo giao diện.

Bạn cũng sẽ nhận được các vấn đề về bộ chọn không hợp lệ. Luôn kiểm tra các lớp và kết nối của Trình tạo giao diện của bạn!

+0

Cảm ơn. Tôi đã có các lớp được chỉ định một cách chính xác trong IB, nhưng có một sự không phù hợp giữa bộ điều khiển của tôi và nib tôi đã chỉ định trong initWithNibName: - Tôi cần phải có bản sao của tôi + dán đặc quyền bị thu hồi. – masty

+0

Chỉ cần quay lại võ đường iOS và thực hành bản sao của bạn + dán-fu. – gonzobrains

0

Nếu bạn đã thực hiện mã này ở một nơi khác và có tệp nén/zip, hãy thử giải nén lại. Nó có thể làm việc Tôi không biết tại sao nhưng tôi cảm thấy như nó là một vấn đề khai thác.

hoặc bạn có thể thử thay đổi IBOutlet thành kramerImage và liên kết lại trong NIB.

2

Tôi đã gặp tình huống này và hóa ra ngay cả sau khi tìm thấy tất cả các phiên bản của biến và xóa chúng mà ứng dụng của tôi vẫn gặp sự cố. Heres những gì đã xảy ra ... Tôi tạo ra một thể hiện của một biến từ một textfield từ XIB của tôi vào viewController.h của tôi nhưng tôi nhận ra tôi không cần nó nữa và xóa nó. Nó chỉ ra chương trình của tôi thấy rằng và tiếp tục cố gắng sử dụng nó trong chương trình vì vậy trong tương lai nếu điều này xảy ra với bất cứ nơi nào khác chỉ cần đi vào bạn XIB nhấp chuột phải vào nút hoặc textfield vv và xóa bất kỳ biến không sử dụng thêm.

2

Đây là cách tôi giải quyết của tôi, trong Trình xây dựng giao diện nhấp chuột phải vào Trình điều khiển chế độ xem, sẽ có dấu chấm than trên lối tắt hoặc phương thức hành động bị thiếu. Tìm và loại bỏ tất cả các tài liệu tham khảo và giải quyết nó.

Điều này xảy ra vì tôi đã xóa phương thức hành động trong tệp .m.

Các vấn đề liên quan