Xcode - Cách khắc phục 'NSUn UnknownKeyException', lý do: LỚP lớp này không phải là giá trị khóa tuân thủ mã hóa cho khóa X "lỗi?


1172

Tôi đang cố gắng liên kết UILabelvới một người IBOutletđược tạo trong lớp của tôi.

Ứng dụng của tôi bị lỗi với lỗi sau.

Điều đó có nghĩa là gì?

Làm thế nào tôi có thể sửa chữa nó?

*** Chấm dứt ứng dụng do ngoại lệ chưa được phát hiện 'NSUn UnknownKeyException', lý do: '[<UIViewContoder 0x6e36ae0> setValue: forUndDefKey:]: lớp này không phải là khóa mã hóa tuân thủ mã hóa cho khóa XXX.'


11
pedrotorres là đúng. Vâng, điều này đúng. Nếu bạn đang thực hiện UITableViewCell, trong IB hãy nhớ đặt Chủ sở hữu tệp thành NSObject và UITableViewCell'Class cho lớp .h bạn đã xác định.
giuseppe

3
Khi bạn gặp phải một vấn đề như vậy và khóa vi phạm là một hành động chứ không phải là một ổ cắm thì rất có thể bạn có một ổ cắm tham chiếu nhầm tên hàm hành động của bạn thay vì tên biến ổ cắm của bạn .
Alex Yursha

2
Bạn nên chú ý rằng tên của khóa trong thông báo lỗi (OP đang gọi nó là 'XXXX') là tên bạn đã đặt cho một cái gì đó trong tệp nib của bạn. Điều đó sẽ giúp thu hẹp tìm kiếm của bạn.
kris

Tôi đã nộp đơn đăng ký: // 22105925 yêu cầu Apple làm cho những lỗi này rõ ràng hơn khi xây dựng. :)
jtbandes

Làm thế nào để thực sự NGAY LẬP TỨC giải quyết vấn đề! stackoverflow.com/a/13812660/294884 mẹo tuyệt vời
Fattie

Câu trả lời:


980

Trình điều khiển xem của bạn có thể có lớp sai trong xib của bạn.

Tôi đã tải về dự án của bạn.

Lỗi bạn nhận được là

'NSUn UnknownKeyception

Nó được gây ra bởi trình Secondđiều khiển xem trong MainWindow.xibviệc có một lớp UIViewControllerthay vìSecondView . Thay đổi thành lớp chính xác giải quyết vấn đề.

Nhân tiện, thật tệ khi có những cái tên như "chuỗi" trong Objective-C. Nó mời một va chạm đặt tên thời gian chạy. Tránh chúng ngay cả trong một lần tắt ứng dụng thực hành. Đặt tên va chạm có thể rất khó theo dõi và bạn không muốn lãng phí thời gian.

Một lý do có thể khác cho lỗi này: khi sao chép và dán các phần tử từ bộ điều khiển này sang bộ điều khiển khác, Xcode bằng cách nào đó giữ liên kết đó với bộ điều khiển gốc, ngay cả sau khi chỉnh sửa & gắn lại phần tử này vào bộ điều khiển mới.

Một lý do có thể khác cho lỗi này:

Ổ cắm xấu.

Bạn đã xóa hoặc đổi tên tên ổ cắm trong .htệp của mình .

Xóa nó trong .xibhoặc .storyboardTrình kiểm tra kết nối của tập tin.

Thêm một lý do có thể

(Trong trường hợp của tôi) Mở rộng UIView với các thuộc tính có thể liên kết và cài đặt giá trị cho các thuộc tính có thể liên kết đó (ví dụ: bóng, bán kính góc, v.v.) sau đó xóa các thuộc tính đó khỏi tiện ích mở rộng UIView (vì một số lý do) nhưng sau đây <userDefinedRuntimeAttributes>vẫn còn trong xml (of foo.storyboard):

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

Giải pháp: Nhấp chuột phải vào foo.storyboard> Mở dưới dạng Mã nguồn> tìm kiếm theo keyPath (tức là ShadowRadius)> Xóa nguyên nhân </userDefinedRuntimeAttributes>gây ra sự cố


9
Cũng đừng quên kết nối ổ cắm "xem" của ngòi với ổ cắm chế độ xem của chủ sở hữu tệp (Cửa sổ xem của lớp tùy chỉnh của bạn được kế thừa từ UIViewControll). Điều này có thể được thực hiện bằng cách điều khiển kéo từ "Chủ sở hữu tệp" trong "Chủ sở hữu vị trí" sang "xem" trong "Đối tượng" và chọn ổ cắm xem.
Nirma

1
Tôi đã đảm bảo tất cả các lớp đã được đặt, nhưng NSUn UnknownKeyException vẫn xuất hiện :(
Zennichimaro

1
Tôi thậm chí không sử dụng Trình tạo giao diện và tôi vẫn gặp lỗi này. Có ai biết cái gì đang xảy ra không?
sudo

12
Đừng bận tâm. Đó là vì hai điều: Xcode vẫn truy cập vào bảng phân cảnh chính của tôi mặc dù nó đã bị xóa khỏi dự án và trình giả lập đã lưu vào bộ nhớ cache. Tôi rất không khuyến khích sử dụng bảng phân cảnh hoặc NIB - chúng có vấn đề một cách nực cười.
sudo

5
@Josh Lol. Mỗi khi tôi làm việc để tạo động lực để tạo một ứng dụng gốc trong xcode, nó luôn kết thúc với việc tôi dành một ngày cố gắng tìm ra cách để làm bất cứ điều gì. Gần đây tôi đang tìm kiếm các dịch vụ từ Xamarin và Telerik (bản gốc).
Người đàn ông Muffin

1524

Bạn có thể có một kết nối xấu trong xib của bạn.

Tôi đã có lỗi này nhiều lần. Mặc dù câu trả lời của TechZen hoàn toàn đúng trong trường hợp này, một nguyên nhân phổ biến khác là khi bạn thay đổi tên của thuộc tính IBOutlet trong .h / .m mà bạn đã kết nối với Chủ sở hữu tệp trong ngòi bút.

Từ ngòi của bạn:

  1. Chọn đối tượng trong IB và đi đến 'Thanh tra kết nối'.
  2. Trong 'Cửa hàng tham chiếu' đảm bảo rằng đối tượng của bạn vẫn chưa được kết nối với tên thuộc tính cũ ... nếu có, hãy nhấp vào 'x' nhỏ để xóa tham chiếu và xây dựng lại.

    nhập mô tả hình ảnh ở đây

Một nguyên nhân phổ biến khác nếu bạn đang sử dụng Storyboard, UIButton của bạn có thể có nhiều hơn một nhiệm vụ (Giải pháp gần giống như đối với ngòi):

  1. Mở bảng phân cảnh của bạn và nhấp chuột phải vào UIButton
  2. Bạn sẽ thấy rằng có nhiều hơn một lần gán / ref cho nút này. Xóa một trong các cửa sổ màu xám "Chính ..." bằng chữ "x" nhỏ:

    ví dụ 2


1
Cảm ơn! Trong trường hợp của tôi, tôi đã có 2 cửa hàng cho cùng một chế độ xem, và loại bỏ cái cũ và nối cái nhìn với cái mới kết thúc ngoại lệ.
Mark Patterson

Của tôi đã được nhân đôi hai lần. Tôi bắt đầu ngắt kết nối từng cái sau khi tôi kéo và thả từ phiên bản Pro (từ phiên bản Lite) vì nghĩ rằng nó đang bị treo trên các kết nối trong dự án khác. Khi tôi bắt gặp bản sao và phải mất 3 lần nhấp để ngắt kết nối, tôi thực sự ước rằng tôi đã làm điều đó 3 ngày trước đó. Oh well- đó là cuộc sống của một dev.
aremvee

Tôi gặp vấn đề là UIButton có nhiều bài tập. Điều này đã giải quyết vấn đề của tôi.
huyền thoại mã hóa

Tôi cũng có vấn đề này. Đừng quên kiểm tra các kết nối đầu ra ở các chế độ xem cụ thể thay vì chỉ giám sát. Trong trường hợp của tôi, các giám sát viên không hiển thị các kết nối sai = /
Augusto Carmo

Tôi đã gặp một lỗi tương tự khi tôi kết nối một ổ cắm nút với tệp swift ViewContoder sai mà trang của họ chưa được tạo bằng GUI
brw59

114

Tôi đã phải xóa ứng dụng khỏi trình giả lập / iPhone để thoát khỏi lỗi này.


1
+1 cái này đã sửa nó cho tôi. Tôi đã làm sạch một số mã sử dụng IB. Khi tôi xóa một nút khỏi mã, lỗi vẫn xuất hiện ngay cả khi nút này hoàn toàn không được tham chiếu trong các tệp nib (ít nhất là tôi có thể thấy).
Chủ nhật,

2
Tôi thấy điều này là cần thiết nếu bạn đang gỡ lỗi hai ứng dụng có cùng tên.
Anton

Đúng, có vẻ như một cái gì đó từ XIB được lưu trong bộ mô phỏng, thật khó khăn nếu bạn đang thử nghiệm nâng cấp vì bạn thực sự không muốn phải xóa ứng dụng cũ.
Carlos P

Tôi gặp vấn đề này khi xóa tập tin XIB của tôi. Điều này đã khắc phục vấn đề.
balboa

4
Nếu xóa ứng dụng không hoạt động, hãy thử xóa thư mục XCode DeruredData. có thể lưu trữ một tập tin xib không chính xác. Mở XCode -> Tùy chọn -> Vị trí -> Mở thư mục DeruredData và kéo nó vào Thùng rác.
Philip Fung

107

Tôi đã gặp lỗi này khi tôi đang cố gắng triển khai ViewCell tùy chỉnh cho một bảng. Khi tôi tô sáng Trình điều khiển xem cho XIB và được kết nối với các phần tử trong CellView gây ra lỗi "lớp này không phải là khóa mã hóa tuân thủ mã hóa cho khóa" khi tôi xóa chúng, nó đã thoát khỏi lỗi.

Xóa các kết nối trong hình dưới đây. Xóa các kết nối trong trình kiểm tra khi Chủ sở hữu tệp được tô sáng

Chỉ cần đảm bảo rằng bạn chỉ có các kết nối với Ô xem bảng. Để kiểm tra bấm vào ô xem bảng và trong INSPECTOR hãy tìm các kết nối của bạn.

Kết nối phải ở đây khi ô Xem bảng được tô sáng


4
Điều này đã làm cho tôi, cảm ơn rất nhiều. Tôi đã loại bỏ các kết nối khi "Chủ sở hữu tệp" được chọn ở cột bên trái, sau đó chọn ô tùy chỉnh của tôi và gắn lại chúng. Sự thành công!
Rogare

Ngay cả với xcode7, công cụ này vẫn hoạt động, chỉ cần sử dụng bảng điều khiển bên phải "Trình kiểm tra kết nối". Loại bỏ ổ cắm khỏi bảngviewcell và từ nhãn, sau đó thêm lại và mọi thứ sẽ hoạt động.
lifeisfoo

3
Điều này hoạt động nhưng bạn cần đảm bảo FileOwner không được thiết lập !! Chủ sở hữu tệp nên vẫn là NSObject. stackoverflow.com/questions/13793162/
hy

Câu trả lời tương tự đã cứu tôi hai lần!
wm.p1us

98

Đôi khi điều này phải thực hiện với "Kế thừa từ mục tiêu" của bạn Giá trị đó phải được đặt. Với các ứng dụng mục tiêu duy nhất, bạn chỉ cần chọn Kế thừa từ mục tiêu. Nếu bạn có nhiều hơn thì một mục tiêu chọn mục tiêu mong muốn.

nhập mô tả hình ảnh ở đây


Câu trả lời này đã giúp tôi cho một trường hợp cụ thể. Tôi phải tiếp tục làm việc với một dự án obj-c cũ với nhiều mục tiêu. Tôi tạo một UITableViewCell tùy chỉnh trong Swift và tôi cũng gặp lỗi tương tự. Bằng cách kích hoạt "Kế thừa từ mục tiêu", nó đã hoạt động. Cảm ơn bạn!
magohamoth

Mô-đun không phải lúc nào cũng được đặt chính xác; ví dụ: nếu bạn điền tên lớp trước khi thực sự tạo lớp.
Johan

Tôi đã điền tên lớp mà không nhấn phím "Enter" ở cuối để IDE không tự động kiểm tra cờ này. Đã lãng phí 1 giờ về việc này. Cảm ơn bạn.
MatPag

Không bao giờ gặp phải loại lỗi này trong obj-c. Nhưng nhờ nó giải quyết được bí ẩn.
Pradeep Kachhawaha

Tại sao điều này được chôn trong trang 3?
Sergio

65

Nếu đó là ứng dụng chỉ dành cho iPhone, không phải là ứng dụng phổ quát, hãy đảm bảo trường sau đây trống:

Mục tiêu> Tóm tắt> Thông tin triển khai iPhone / iPod> Giao diện chính

Nếu bạn chỉ định một xib ở đó nó gặp sự cố.


2
Đúng, đó là cho tôi. Trong khi di chuyển xung quanh để thêm bộ điều khiển xem khởi động mới, tôi đặt cái này thành lớp / ngòi mới. Sau khi kết nối với cửa hàng xem, tôi đã gặp lỗi này. Xóa trường này đã sửa nó.
terriblememory

Điều này làm việc cho tôi. Lưu ý rằng tôi cũng phải xóa phiên bản cũ khỏi thiết bị / trình giả lập để nó hoạt động.
jimt

Cảm ơn - đây là vấn đề của tôi. Tôi đã đổi tên tệp bảng phân cảnh iPad của mình và không cập nhật trong các bản dự án của dự án.
RobertJoseph

2
Cảm ơn bạn! Điều này đã giải quyết nó cho tôi. (Tôi đã phải xóa ứng dụng khỏi trình giả lập sau khi thay đổi trường Giao diện chính thành trống. Chỉ cần thay đổi trường đó đã không buộc trình giả lập phá vỡ bộ đệm.)
snipe

Tôi nhớ rằng tôi đã thay đổi mọi thứ từ một ứng dụng phổ quát sang ứng dụng chỉ dành cho iphone và điều này đã sửa lỗi!
Justin

59

Lỗi này chỉ ra rằng một đối tượng Trình tạo giao diện đã được kết nối đã bị xóa / đổi tên trong nguồn của chủ sở hữu (Chủ sở hữu tệp).

Nhấp chuột phải vào Chủ sở hữu tệp trong Trình tạo giao diện nếu bạn thấy dấu chấm than bạn cần khắc phục.

Trong hình bên dưới, bạn có thể thấy "aRemondView" có dấu chấm than ở bên phải, đó là vì tôi đã xóa đối tượng xem IBOutlet trong khi nó đã được kết nối trong IB.

nhập mô tả hình ảnh ở đây

Điều này đưa ra lỗi sau: Chấm dứt ứng dụng do ngoại lệ chưa được phát hiện 'NSUn UnknownKeyException', lý do: '[setValue: forUndDefKey:]: lớp này không phải là khóa mã hóa tuân thủ mã hóa cho khóa aRemondView.'


Cảm ơn bạn! CÁi này đã sửa nó giúp tôi. Tôi đã gặp vấn đề này trong một thời gian dài và không biết cách khắc phục nó ngoài việc bắt đầu lại từ đầu. Đây là nó, đã xóa IBOutlets khỏi trình điều khiển xem, nhưng không biết chúng vẫn được tham chiếu / liên kết trong chủ sở hữu (trong trường hợp này là "Trình điều khiển xem" trong trình tạo giao diện - Xcode 6).
Ira Herman

41

Tôi đã có cùng một vấn đề và trong khi câu trả lời của TechZen thực sự đáng kinh ngạc, tôi thấy khó áp dụng vào tình huống của mình.

Cuối cùng, tôi đã giải quyết vấn đề bằng cách liên kết nhãn thông qua Bộ điều khiển được liệt kê trong Đối tượng (được tô sáng trong hình ảnh bên dưới) thay vì thông qua Chủ sở hữu tệp .

Hi vọng điêu nay co ich.

nhập mô tả hình ảnh ở đây


37

trong trường hợp của tôi, đó là một lỗi trong mã nguồn bảng phân cảnh, hãy làm theo các bước sau:

  1. đầu tiên mở bảng câu chuyện của bạn dưới dạng mã nguồn
  2. tìm kiếm <connections>
  3. loại bỏ các kết nối không mong muốn

Ví dụ:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

Như bạn thấy, đây là các kết nối giữa tên của các biến mã của bạn và các thẻ xml bố cục bảng phân cảnh;)


33

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Cách khắc phục của tôi tương tự như Gerard Grundy. Khi tạo UITableViewCell tùy chỉnh bằng XIB, tôi đã áp dụng nhầm tên Lớp tùy chỉnh cho Chủ sở hữu tệp thay vì cho UITableViewCell. Áp dụng lớp cho UITableViewCell trên khung vẽ và kết nối các thuộc tính IBOutlet của tôi với nó để giải quyết vấn đề.


Ayyy dag nab nó ... Không thể tin được tôi thường xuyên mắc lỗi này. Cảm ơn lol
Benjamin

31
  1. Bạn chỉ cần xác định IBOutletmột lần, IBOutletnhãn ivar của bạn là không cần thiết.
  2. Bạn đang khởi tạo NIB của bạn bằng cách sử dụng của bạn UIViewController? Tại một số điểm bạn nên gọi[SecondView initWithNibName:@"yourNibName" bundle:nil];

Điều này đã giúp! Tôi đã nhận được một lỗi tuân thủ mã hóa giá trị khóa về một thuộc tính từ một bộ điều khiển khung nhìn khác. Hóa ra tôi đã gọi -initWithNibNamenhầm tên ngòi.
jlstrecker

Có điều này đã giúp tôi quá .. tôi đã sử dụng UIViewController thay vì MyCustomeViewController .. nhưng đây là loại vấn đề phân cấp có thể được .. các mẫn không thành công vì đã lỡ đặt đối tượng lớp .. Cảm ơn bạn anyways
Futur

Tôi đã có một vấn đề tương tự. Hai mục nhập IBAction giống hệt nhau một cách tình cờ. Không hiển thị trong mã, chỉ trong nhấp chuột phải của UIControl (Một UIStepper trong trường hợp của tôi). Chỉ cần xóa một cái đã sửa nó.
Dave Hubbard

30

Điều này chỉ xảy ra với tôi khi gỡ lỗi trên thiết bị (iPhone). Trình mô phỏng iOS đã hoạt động tốt. Thực hiện "Sản phẩm-> Làm sạch" từ Xcode dường như để giải quyết vấn đề, nhưng tôi không biết tại sao.


Điều này giải quyết vấn đề của tôi. tsk2x gần 3 ngày đau đầu.
dùng3818576

5
Nó cung cấp một câu trả lời cho câu hỏi. Một cái gì đó đã bị rối tung trong Nib và làm sạch nó đã giải quyết nó. Tôi đã đọc và thử tất cả những điều trên nhưng không có kết quả và sau đó đã làm sạch, và sau 1 giờ cố gắng sửa nó, giải pháp của Maj đã sửa nó. Tôi rất muốn xem những gì trong XML có thể gây ra điều này nhưng tôi đã tiếp tục.
LevinsonTechnology

Điều này thực sự giải quyết được vấn đề - Tôi đã thử rất nhiều đề xuất ở trên và chỉ có dự án mới sửa lỗi này đột nhiên bắt đầu xảy ra. Xin chào ...
DustinB

Điều này khắc phục vấn đề của tôi, tôi đã thử rất nhiều đề xuất ở trên. Có vẻ lạ!
Naveen Shan

23

Tôi đã có chính xác thông báo lỗi và cảm ơn (!!) đến Kira từ http://www.idev101.com tôi đã có thể giải quyết thử thách. Tôi chỉ tìm thấy trang web của cô ấy sau khi googling và xếp chồng lên tất cả các chủ đề này. Bây giờ tôi đang đăng bài ở đây cho bài tiếp theo đến với StackOverFlow và có cùng thách thức với tôi vì người đó rất có thể sẽ đến với chủ đề này trên Google.

Tôi nhận ra rằng tôi đã làm sai điều này:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Thay vì NÀY:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Ở đâu

DeviceViewController

Tên của lớp tôi còn được gọi là

DeviceViewController.h 
DeviceViewController.m

Bạn sẽ phải

"import DeviceViewController.h"

trong triển khai của bạn (.m File) nơi bạn muốn gọi, ví dụ như một UIViewControll khác.

Tôi hoàn toàn không xin lỗi nếu tôi chỉ nêu rõ ràng cho những người mới bắt đầu như tôi và có thể nhận được phiếu bầu vì điều này không liên quan chính xác đến câu hỏi nhưng tôi đã tìm kiếm 4 (?!?) Ngay bây giờ để tìm câu trả lời cho các thông báo lỗi này . Nếu tôi có thể dành điều này cho 1 hoặc 2 người thì thật tuyệt :)

PS: Dành cho những người quan tâm đến cách mã tiếp tục tải UIViewControll khác:

    [self presentViewController:deviceViewController animated:YES completion:nil];

CẢM ƠN tất cả các bước ở đó, tôi đã sử dụng Xcode 5 và không thực sự biết cách thêm ngòi thủ công vì bạn chỉ có thể thêm bảng phân cảnh theo mặc định .... Tôi có một số hướng dẫn nhưng không chi tiết như của bạn. Thực sự đã giúp !!
Pittfall

"Tôi đã làm sai điều này ..." cảm ơn, đây không phải là lần đầu tiên tôi chi tiêu nhiều vì sai lầm thực sự ngu ngốc này
tontonCD

23

Nó có thể xuất phát từ thực tế là bạn đã kiểm soát kéo và tạo một ổ cắm hoặc hành động và quên xóa nó. Ngay cả khi bạn đã xóa mã hoặc ngay cả khi bạn đã tạo đủ cmd + Z, bạn sẽ cần phải đi vào trình kiểm tra kết nối của bảng phân cảnh của mình và xem liệu hành động hoặc ổ cắm bạn tạo có còn ở đây hay không.


Cảm ơn! Tôi là một n00b trên Xcode và mất một lúc để tìm các liên kết giả mạo. Trong Xcode 9.2, bạn có thể nhấp chuột phải vào thành phần trong chế độ xem bảng phân cảnh và kiểm tra "Cửa hàng tham chiếu".
kunigami

21

Nhìn qua các câu trả lời khác có vẻ như có rất nhiều điều có thể gây ra lỗi này. Đây là một trong nhiều.

nếu bạn

  • có chế độ xem tùy chỉnh
  • đã thêm một tài sản @IBInspectable
  • và sau đó xóa nó

Sau đó, bạn cũng có thể nhận được một lỗi tương tự như

Không thể đặt (xxx) thuộc tính được kiểm tra do người dùng xác định trên [Chế độ xem tùy chỉnh của bạn] ...: lớp này không phải là giá trị khóa tuân thủ mã hóa cho khóa [xxx].

Giải pháp là xóa tài sản cũ.

nhập mô tả hình ảnh ở đây

Mở trình kiểm tra danh tính cho lớp của bạn, chọn tên thuộc tính trong Thuộc tính thời gian chạy do người dùng xác định và nhấn nút trừ (-).


Tôi đến rất thường xuyên trên trang này ... Lần này giải pháp này đã được thực hiện! Nhưng kỳ lạ là âm thanh thuộc tính cũ cần xóa thực sự nằm trên một ViewContoder khác so với cái mà nó gặp sự cố, tôi không biết tại sao.
Cinn

15

Điều này xảy ra với tôi khi trình điều khiển xem của tôi ban đầu có tệp .xib, nhưng bây giờ được tạo bằng lập trình.

Mặc dù tôi đã xóa tệp .xib khỏi dự án này. Người dùng iPhone / iPad có thể chứa tệp .xib cho trình điều khiển chế độ xem này.

Cố gắng tải tệp .xib thường gây ra sự cố này:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

Giải pháp khi tạo nó theo lập trình có thể là thế này:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}

12

Thuộc tính "Mô-đun" của Trình điều khiển xem trong Trình kiểm tra danh tính có thể khác với những gì bạn mong đợi. Cũng đảm bảo rằng các lớp mới được thêm vào danh sách mục tiêu của bạn.


bỏ phiếu vì nó là như vậy trong trường hợp của tôi. Tôi đang sử dụng Swift và Storyboards. Khi tôi tạo mục tiêu xây dựng mới (để tạo biến thể xây dựng), ứng dụng không hoạt động trong biến thể mới trong khi mục tiêu đầu tiên hoạt động tốt. Ứng dụng đã bị sập trên Bộ điều khiển Chế độ xem trong đó tên mô-đun bằng cách nào đó được đặt thành mô-đun từ mục tiêu đầu tiên, trong khi hoạt động Bộ điều khiển Chế độ xem là Hiện tại - <tên mô-đun tại đây> . Bạn cần xóa tên mô-đun ở đó trong trường hợp này.
Mixaz

11

Tôi đã có một vấn đề tương tự cho một dự án có hai mục tiêu (với MainWindow XIB của riêng họ). Vấn đề cơ bản gây ra lỗi này đối với tôi là lớp UIViewControll không được đưa vào danh sách tài nguyên của dự án thứ hai. Trình xây dựng giao diện nghĩa là cho phép tôi chỉ định nó trong MainWindow.xib, nhưng trong thời gian chạy, hệ thống không thể định vị lớp.

Tức là nhấp chuột vào lớp UIViewControll trong câu hỏi và kiểm tra kỹ xem nó có được bao gồm trong tab 'Mục tiêu không.


9

Chỉ để thêm vào điều này, bởi vì tôi cũng đã nhận được lỗi này. Đi qua tất cả các câu trả lời này dường như áp dụng để làm việc với giao diện người dùng và bảng phân cảnh. Tôi biết người đăng ban đầu dường như đã làm việc với UI nhưng khi tìm kiếm lý do có thể xảy ra lỗi này, hầu hết tất cả các câu hỏi đều dẫn đến câu hỏi này với những người khác bị đóng như là bản sao hoặc đơn giản là có vấn đề với việc kết nối mọi thứ trong bảng phân cảnh nên tôi sẽ thêm giải pháp của tôi.

Tôi đã làm việc về mã hóa một dịch vụ web trong Swift 2. Tôi đã xây dựng tất cả các đối tượng proxy và sơ khai cần thiết. Khi tôi lặp lại XML đã trả về, tôi đang tự động khởi tạo các đối tượng của mình, tất cả đều xuất phát NSObjectvà sử dụng setValue:forKeytrên chúng. Mỗi lần setValue:forKeycố gắng thiết lập một tài sản, nó lại xuất hiện lỗi này.

Tôi đã có một tuyên bố chuyển đổi cho mỗi loại I được giao dịch với (ví dụ Bool?, CShort?, String?) và cho mỗi nút XML tôi đã đi qua và kiểm tra những gì loại là trên đối tượng và sau đó chuyển đổi các giá trị cho loại đó và cố gắng đặt nó với setValue:forKey.

Cuối cùng, tôi bắt đầu bình luận tất cả những setValue:forKeydòng này và thấy rằng defaulttrường hợp câu lệnh chuyển đổi của tôi đã hoạt động String?.

Cuối cùng tôi đã nhận ra rằng bạn không thể sử dụng các loại swift tùy chọn setValue:forKeytrừ khi chúng có ánh xạ trực tiếp đến loại Objective-C như String?hoặc NSNumber?. Tôi đã kết thúc việc thay đổi tất cả các CShort?loại thành NSNumber?từ đó có ánh xạ trực tiếp. Vì Bool?trong trường hợp của tôi, tôi chỉ cần sử dụng Boolvà khởi tạo nó là ổn false. Những người khác có thể không có sự sang trọng đó.

Dù sao, điều đau đầu đến mức hy vọng điều này sẽ giúp người khác gặp vấn đề tương tự và tiếp tục được chuyển hướng đến câu hỏi này và nói với chính họ, "Tôi không làm gì trong UI !!".

Vì vậy, cuối cùng để nhắc lại một lần nữa Mã hóa khóa-giá trị không hoạt động với các tùy chọn. Bên dưới tôi đã kết thúc việc tìm kiếm ở đâu đó nhưng tôi quên nơi mà bất cứ ai đăng bài này tôi đều xin lỗi và sẽ ghi công nếu tôi nhớ nơi tôi tìm thấy thứ này nhưng nó đã cứu mạng tôi:

Bạn không thể sử dụng KVC trên thuộc tính Int tùy chọn, vì KVC là Ca cao / Mục tiêu-C và Mục tiêu-C không thể thấy Int tùy chọn - nó không được kết nối với Objective-C. Objective-C chỉ có thể thấy các loại được bắc cầu đến Objective-C:

các loại lớp có nguồn gốc từ NSObject

các loại lớp được tiếp xúc với @objc

Cấu trúc Swift được bắc cầu


1
Nếu bạn đang cố gắng kết nối giá trị bool Swift thông qua các ràng buộc Ca cao, bạn cần hiển thị nó với chỉ thị @objc; nếu không bạn thực sự nhận được lỗi này. Đây phải là câu trả lời tốt nhất.
jvarela

9

"lớp này không phải là khóa tuân thủ mã hóa giá trị khóa" Tôi biết nó hơi muộn nhưng câu trả lời của tôi khác nên tôi nghĩ nó cần được đăng, tôi đã đẩy bộ điều khiển thứ hai sai cách, Đây là mẫu

Sai cách để điều khiển đẩy

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Đúng cách

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Tôi không tìm thấy bất kỳ câu trả lời như trên vì vậy có thể nó có thể giúp một số người có vấn đề tương tự


8

Đó có thể là trường hợp tham chiếu một thành phần từ Giao diện Xib mà bạn đã đổi tên hoặc xóa. Tham khảo lại công việc cho tôi.


8

Tôi chỉ gặp vấn đề này trong dự án trùng lặp của mình và giải quyết bằng cách kiểm tra 2 vị trí:

1- Đảm bảo rằng bạn có tệp .m trong danh sách -> Dự án - Giai đoạn xây dựng - Biên dịch nguồn
2- Sau đó, hãy chuyển đến trình tạo giao diện (có thể đây là lỗi xảy ra chỉ với IB) và hủy liên kết tất cả các thuộc tính, nhãn, hình ảnh , v.v ... Sau đó liên kết lại tất cả. Tôi đã nhận ra rằng tôi đã xóa một thuộc tính nhưng nó vẫn được liên kết trong IB.

Hy vọng nó hoạt động cho một số.


7

Một vấn đề "không tuân thủ" khác mà tôi tìm thấy là khi tôi quản lý để có hai bản sao của một lớp vì một số lý do.

Tôi đã thêm khóa vào bản sao sai. Trình tạo giao diện vẫn nhìn thấy các khóa và để tôi nối với chúng, nhưng trong thời gian chạy, nó đang sử dụng bản sao khác của lớp không có khóa mới.

Để tìm ra bản sao "đúng" nào, tôi đã sử dụng cmd-click vào tên lớp ở nơi khác để chuyển sang bản sao chính xác, sau đó tôi đã loại bỏ các bản sao không sử dụng xấu (trước khi đưa ra các chỉnh sửa của mình từ bản sao chưa sử dụng trước).

Đạo đức của câu chuyện: các tập tin lớp trùng lặp là xấu.


7

Lỗi này là một cái gì đó khác!

Đây là cách tôi sửa nó. Tôi đang sử dụng xcode Phiên bản 6.1.1 và đang sử dụng swift. Tôi đã gặp lỗi này mỗi khi ứng dụng của tôi cố gắng thực hiện một segue để chuyển sang màn hình tiếp theo. Đây là những gì tôi đã làm.

  1. Kiểm tra xem nút đã được kết nối với hành động đúng chưa (Đây không phải là vấn đề, nhưng vẫn tốt để kiểm tra)
  2. Kiểm tra xem nút không có bất kỳ hành động hoặc cửa hàng bổ sung nào mà bạn có thể đã tạo nhầm. (Đây không phải là vấn đề, nhưng vẫn tốt để kiểm tra)
  3. Kiểm tra nhật ký và đảm bảo rằng tất cả các nút trong MÀN HÌNH TIẾP THEO có hành động chính xác và nếu có bất kỳ sự khác biệt nào, hãy đảm bảo rằng chúng có một mã định danh duy nhất. (Đây là vấn đề)
    • Một trong những sự khác biệt không có một định danh duy nhất
    • Một trong các nút có một hành động và hai cửa hàng mà tôi tạo ra do nhầm lẫn.
    • Xóa bất kỳ cửa hàng bổ sung nào và đảm bảo rằng các phân biệt cho màn hình tiếp theo có số nhận dạng duy nhất.

Chúc mừng


6

Tôi đã có cùng một triệu chứng. Nguyên nhân sâu xa là "Tư cách thành viên mục tiêu" cho tệp nguồn của tôi không được đặt thành đúng mục tiêu. Tôi cho rằng điều đó có nghĩa là lớp học của tôi sẽ không được xây dựng và đưa vào ứng dụng của tôi.

Để sửa nó:

  1. Làm nổi bật tập tin .m của bạn.
  2. Trong khung bên phải, chọn Trình kiểm tra tệp.
  3. Trong phần "Thành viên mục tiêu", đảm bảo mục tiêu xây dựng phù hợp được chọn.

Hy vọng điều này sẽ giúp ai đó ngoài kia.


6

Nếu bạn có một lớp con UIViewControll tùy chỉnh với IBOutlets đang gây ra sự cố thì tập hợp các bước duy nhất tôi tìm thấy để thực sự thoát khỏi lỗi là

.1 Thay đổi lớp thành UIViewControll

.2 Ngắt kết nối tất cả các ổ cắm (tất cả chúng sẽ có hình tam giác cảnh báo màu vàng bây giờ) - có thể chỉ cần ngắt kết nối (các) ổ cắm có vấn đề.

.3 Thực hiện tất cả các bước tiêu chuẩn - K, xóa Dữ liệu đã tạo (, thảm cầu nguyện, chuỗi hạt lo lắng)

.4 Khởi chạy ứng dụng - đi đến cảnh có vấn đề.

.5 Giết ứng dụng, quay lại Trình tạo giao diện thay đổi lớp trở lại tên lớp tùy chỉnh của bạn.

.6 Kết nối lại các cửa hàng của bạn.

Khởi chạy ứng dụng & điều này thường sẽ xóa các vấn đề tuân thủ khóa-giá trị.


Điều này hoạt động khi sao chép và dán một cảnh trong trình chỉnh sửa Storyboard.
Mizmor

5

Trong trường hợp của tôi. Tôi đã không bỏ lỡ các cửa hàng trong tập tin xib sau khi hợp nhất.

Shift + Lệnh + K

giải quyết vấn đề của tôi Tôi đã làm sạch dự án của tôi và xây dựng lại.


4

Trong trường hợp của tôi, điều này được gây ra bằng cách tham chiếu Nib sai:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

1
Xảy ra với tôi khi tôi đổi tên lớp của trình điều khiển khung nhìn và quên rằng tên ngòi cũng cần phải thay đổi. Vì tên ngòi chỉ là một chuỗi, không có lỗi biên dịch.
kris

3

Tôi đã nhận được lỗi này với bảng phân cảnh. Giải pháp trên dường như không phải là vấn đề nên cuối cùng tôi đã xóa bộ điều khiển khung nhìn và thêm nó trở lại (và tất nhiên là kết nối lại segue và gán lại lớp) đã sửa nó. Tôi không biết nó thực sự là gì, nhưng tôi đã đổi tên lớp trình điều khiển khung nhìn liên kết ngay trước khi nó bắt đầu, vì vậy có lẽ điều đó đã gây ra điều gì đó.


Tôi đã nhận được lỗi này một lần nữa. Lần này tôi đã tạo một bộ điều khiển xem bảng trống mới với lớp của tôi được gán cho nó, để một cái không hoạt động một mình và di chuyển segue đến nó. Điều này đã làm việc. Sau đó tôi từ từ sao chép mọi yếu tố trong chế độ xem cho đến khi nó thất bại một lần nữa. Lần này, vấn đề hóa ra là tôi đã gán một số "Thuộc tính thời gian chạy do người dùng xác định" cho một bộ chọn (Tôi đã nghĩ rằng tôi có thể sử dụng chúng để khởi tạo trình chọn để tôi không phải làm mã, không biết có khả thi không ). Loại bỏ điều đó đã khắc phục vấn đề. Lỗi này thực sự khủng khiếp, tôi hy vọng nó sẽ được cải thiện trong phiên bản tương lai!
xứng

3

Tôi đã có cùng một vấn đề. Tôi đã đặt lại trình giả lập. Loại bỏ và thêm nút điều khiển. và cuối cùng đã làm sạch :) Nhờ chồng tràn. Một số cách mã của tôi trở nên ok và bắt đầu làm việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.