Xcode - วิธีการแก้ไข 'NSUnknownKeyException' เหตุผล: …คลาสนี้ไม่ได้เป็นค่าคีย์ตามมาตรฐานการเข้ารหัสสำหรับคีย์ X "ข้อผิดพลาด?


1172

ฉันกำลังพยายามเชื่อมโยงUILabelกับสิ่งที่IBOutletสร้างขึ้นในชั้นเรียนของฉัน

แอปพลิเคชันของฉันทำงานล้มเหลวโดยมีข้อผิดพลาดดังต่อไปนี้

สิ่งนี้หมายความว่า?

ฉันจะแก้ไขได้อย่างไร

*** แอปสิ้นสุดเนื่องจากข้อยกเว้นที่ไม่ได้ตรวจสอบ 'NSUnknownKeyException' เหตุผล: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: คลาสนี้ไม่ใช่ค่าคีย์ที่เข้ารหัสตามคีย์ XXX'


11
pedrotorres ถูกต้อง ใช่ถูกต้องแล้ว หากคุณกำลังทำ UITableViewCell ใน IB อย่าลืมให้เจ้าของไฟล์เป็น NSObject และ UITableViewCell'Class ในคลาส. h ที่คุณกำหนดไว้
giuseppe

3
เมื่อคุณพบปัญหาดังกล่าวและคีย์ที่มีการละเมิดคือการกระทำมากกว่าทางออกดังนั้นคุณอาจมีทางออกที่อ้างอิงชื่อฟังก์ชั่นการกระทำของคุณโดยไม่ตั้งใจแทนชื่อตัวแปรเต้าเสียบของคุณ
Alex Yursha

2
คุณควรสังเกตว่าชื่อของคีย์ในข้อความแสดงข้อผิดพลาด (OP เรียกว่า 'XXXX') เป็นชื่อที่คุณให้กับบางสิ่งในไฟล์ปลายปากกาของคุณ สิ่งนี้จะช่วยให้การค้นหาของคุณแคบลง
kris

ฉันยื่น rdar: // 22105925 ขอให้ Apple ทำข้อผิดพลาดเหล่านี้ให้ชัดเจนยิ่งขึ้นในเวลาสร้าง :)
jtbandes

วิธีการแก้ปัญหาทันที! stackoverflow.com/a/13812660/294884เคล็ดลับที่ยอดเยี่ยม
Fattie

คำตอบ:


980

ตัวควบคุมมุมมองของคุณอาจมีคลาสไม่ถูกต้องใน xib ของคุณ

ฉันดาวน์โหลดโครงการของคุณ

ข้อผิดพลาดที่คุณได้รับคือ

'NSUnknownKeyException' เหตุผล: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: คลาสนี้ไม่ได้เป็นค่าคีย์เข้ารหัสตามสตริงคีย์'

มันเกิดจากการSecondควบคุมมุมมองในMainWindow.xibการมีระดับของแทนUIViewController SecondViewการเปลี่ยนคลาสที่ถูกต้องช่วยแก้ปัญหา

โดยวิธีการมันเป็นวิธีที่ไม่ดีที่จะมีชื่อเช่น "สตริง" ในวัตถุประสงค์ -C มันเชิญชนการตั้งชื่อรันไทม์ หลีกเลี่ยงพวกเขาแม้ในครั้งเดียวปิดแอพฝึกฝน การตั้งชื่อการชนอาจทำได้ยากมากและคุณไม่ต้องการเสียเวลา

อีกเหตุผลที่เป็นไปได้สำหรับข้อผิดพลาดนี้: เมื่อคัดลอก & วางองค์ประกอบจากคอนโทรลเลอร์หนึ่งไปยังอีก Xcode จะเก็บลิงค์นั้นไปยังคอนโทรลเลอร์เดิมแม้ว่าจะทำการแก้ไข & เชื่อมโยงองค์ประกอบนี้ไปยังคอนโทรลเลอร์ใหม่ก็ตาม

อีกสาเหตุที่เป็นไปได้สำหรับข้อผิดพลาดนี้:

ร้านไม่ดี

คุณได้ลบหรือเปลี่ยนชื่อชื่อร้านใน.hไฟล์ของคุณ

ลบออกใน.xibหรือ.storyboardตรวจสอบการเชื่อมต่อของไฟล์

อีกเหตุผลหนึ่งที่เป็นไปได้

(ในกรณีของฉัน) ส่วนขยายของ UIView ด้วยคุณสมบัติที่สามารถรวมได้และการตั้งค่าสำหรับคุณสมบัติที่สามารถรวมได้ (เช่นเงารัศมีของมุม ฯลฯ ) จากนั้นลบคุณสมบัติเหล่านั้นออกจากส่วนขยาย UIView (ด้วยเหตุผลบางอย่าง) แต่<userDefinedRuntimeAttributes>ยังคงอยู่ใน xml (จาก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>

การแก้ไข:คลิกขวาที่foo.storyboard> เปิดเป็นซอร์สโค้ด> ค้นหาโดย keyPath (เช่น shadowRadius)> ลบสิ่ง</userDefinedRuntimeAttributes>ที่ทำให้เกิดปัญหา


9
อย่าลืมที่จะเชื่อมต่อช่อง "view" ของปลายปากกาไปยังช่องมองภาพของเจ้าของไฟล์ (ช่องมุมมองของคลาสที่คุณกำหนดเองที่สืบทอดมาจาก UIViewController) สิ่งนี้สามารถทำได้โดยการควบคุมการลากจาก "เจ้าของไฟล์" ภายใต้ "สถานที่ยึด" ถึง "ดู" ภายใต้ "วัตถุ" และเลือกร้านดู
Nirma

1
ฉันทำให้แน่ใจว่าชั้นทั้งหมดได้รับการตั้งค่าแล้ว แต่ NSUnknownKeyException ยังคงออกมา :(
Zennichimaro

1
ฉันไม่ได้ใช้ตัวสร้างส่วนต่อประสานและฉันยังคงได้รับข้อผิดพลาดนี้ ความคิดใด ๆ ที่เกิดขึ้น?
sudo

12
ไม่เป็นไร. มันเป็นเพราะสองสิ่ง: Xcode ยังคงเข้าถึงกระดานเรื่องราวหลักของฉันแม้ว่ามันจะถูกลบออกจากโครงการและเครื่องมือจำลองมีแคชอยู่ ฉันขอแนะนำอย่างมากโดยใช้สตอรีบอร์ดหรือ NIBs - พวกเขามีปัญหาอย่างน่าขัน
sudo

5
@Josh Lol ทุกครั้งที่ฉันสร้างแรงบันดาลใจในการสร้างแอปเนทีฟใน xcode มันมักจะจบลงด้วยการที่ฉันใช้เวลาทั้งวันพยายามหาวิธีทำอะไร ฉัน ac # dev ดังนั้นฉันได้ดูข้อเสนอจาก Xamarin และ Telerik (ชาวพื้นเมือง) เมื่อเร็ว ๆ นี้
มัฟฟินแมน

1524

คุณอาจมีการเชื่อมต่อที่ไม่ดีใน xib ของคุณ

ฉันมีข้อผิดพลาดนี้หลายครั้ง ในขณะที่คำตอบของ TechZen นั้นถูกต้องอย่างแน่นอนในกรณีนี้อีกสาเหตุที่พบบ่อยคือเมื่อคุณเปลี่ยนชื่อของคุณสมบัติ IBOutletใน. h / .m ซึ่งคุณเชื่อมต่อกับเจ้าของไฟล์ในปลายปากกาแล้ว

จากปลายปากกาของคุณ:

  1. เลือกวัตถุใน IB และไปที่ 'การเชื่อมต่อผู้ตรวจสอบ'
  2. ภายใต้ 'การอ้างอิงร้านค้า' ตรวจสอบให้แน่ใจว่าวัตถุของคุณยังไม่ได้เชื่อมต่อกับชื่อคุณสมบัติเก่า ... ถ้าเป็นให้คลิก 'x' ขนาดเล็กเพื่อลบการอ้างอิงและสร้างอีกครั้ง

    ป้อนคำอธิบายรูปภาพที่นี่

สาเหตุทั่วไปอีกประการหนึ่งหากคุณใช้กระดานเรื่องราว UIButton ของคุณอาจมีการมอบหมายมากกว่าหนึ่งครั้ง (โซลูชันเกือบจะเหมือนกับปลายปากกา):

  1. เปิดกระดานเรื่องราวของคุณและคลิกขวาที่ UIButton
  2. คุณจะเห็นว่ามีการมอบหมาย / อ้างอิงมากกว่าหนึ่งปุ่มนี้ ลบหนึ่งในหน้าต่าง "หลัก ... " เป็นสีเทาด้วย "x" ขนาดเล็ก:

    ตัวอย่างที่ 2


1
ขอบคุณ! ในกรณีของฉันฉันมีร้านค้า 2 แห่งในมุมมองเดียวกันและกำจัดร้านเก่าและต่อมุมมองไปยังร้านใหม่จบลงด้วยข้อยกเว้น
Mark Patterson

ของฉันถูกทำซ้ำสองครั้ง ฉันเริ่มตัดการเชื่อมต่อแต่ละอันหลังจากที่ฉันลากและวางจากรุ่น Pro (จากรุ่น Lite) โดยคิดว่ามันติดอยู่กับการเชื่อมต่อในโครงการอื่น เมื่อฉันเจอสำเนาที่ซ้ำกันและใช้เวลา 3 คลิกเพื่อทำการตัดการเชื่อมต่อฉันขอแสดงความนับถืออย่างจริงใจว่าฉันได้ทำไปแล้ว 3 วันก่อนหน้านี้ โอ้เป็นชีวิตของนักพัฒนา
aremvee

ฉันมีปัญหาที่ UIButton มีการมอบหมายมากกว่าหนึ่งครั้ง นี่เป็นการแก้ไขปัญหาของฉัน
mythicalcoder

ฉันมีปัญหานี้เช่นกัน อย่าลืมตรวจสอบการเชื่อมต่อเต้าเสียบในมุมมองที่เฉพาะเจาะจงแทนที่จะดูเฉพาะการกำกับดูแล ในกรณีของฉันผู้ดูแลไม่แสดงการเชื่อมต่อที่ผิด = /
Augusto Carmo

ฉันมีข้อผิดพลาดที่คล้ายกันซึ่งฉันเชื่อมต่อปุ่มเต้าเสียบกับไฟล์ ViewController swift ผิดที่หน้าจะไม่ถูกสร้างขึ้นโดยใช้ GUI
brw59

114

ฉันต้องลบแอพออกจากตัวจำลอง / iPhone เพื่อกำจัดข้อผิดพลาดนี้


1
+1 สิ่งนี้แก้ไขได้สำหรับฉัน ฉันกำลังล้างรหัสบางส่วนที่ใช้ IB เมื่อฉันลบปุ่มออกจากรหัสข้อผิดพลาดยังคงปรากฏขึ้นแม้ว่าจะไม่ได้อ้างถึงปุ่มนี้เลยในไฟล์ปลายปากกา (อย่างน้อยฉันก็จะเห็น)
อาทิตย์

2
ฉันคิดว่านี่เป็นสิ่งจำเป็นหากคุณกำลังดีบักสองแอปพลิเคชั่นที่มีชื่อเหมือนกัน
Anton

ดูเหมือนว่ามีบางอย่างจาก XIB ถูกแคชไว้ในตัวจำลองซึ่งเป็นความเจ็บปวดถ้าคุณทดสอบการอัปเกรดเนื่องจากคุณไม่ต้องการลบแอปเก่า
Carlos P

ฉันมีปัญหานี้การลบไฟล์ XIB ของฉัน วิธีนี้แก้ไขปัญหาได้
balboa

4
หากการลบแอปไม่ทำงานให้ลองลบโฟลเดอร์ XCode DerivedData ซึ่งสามารถแคชไฟล์ xib ที่ไม่ถูกต้อง เปิด XCode -> Preferences -> Locations -> เปิดโฟลเดอร์ DerivedData แล้วลากไปที่ถังขยะ
Philip Fung

107

ฉันมีข้อผิดพลาดนี้เมื่อฉันพยายามใช้ ViewCell ที่กำหนดเองสำหรับตาราง เมื่อฉันไฮไลต์ตัวควบคุมมุมมองสำหรับ XIB และเชื่อมต่อกับองค์ประกอบใน CellView ทำให้เกิดข้อผิดพลาด "คลาสนี้ไม่ใช่ค่าคีย์ตามมาตรฐานการเข้ารหัสสำหรับคีย์" เมื่อฉันลบสิ่งเหล่านี้แล้วมันก็กำจัดข้อผิดพลาดได้

ลบการเชื่อมต่อในภาพด้านล่าง ลบการเชื่อมต่อในตัวตรวจสอบเมื่อมีการเน้นเจ้าของไฟล์

ตรวจสอบให้แน่ใจว่าคุณมีการเชื่อมต่อกับ Table View Cell เท่านั้น ในการตรวจสอบคลิกที่เซลล์มุมมองตารางและ INSPECTOR มองหาการเชื่อมต่อของคุณ

การเชื่อมต่อควรอยู่ที่นี่เมื่อไฮไลต์ Table View Cell


4
สิ่งนี้ทำเพื่อฉันขอบคุณมาก ฉัน x ออกจากการเชื่อมต่อเมื่อเลือก "เจ้าของไฟล์" ในคอลัมน์ด้านซ้ายจากนั้นเลือกเซลล์ที่กำหนดเองของฉันและติดตั้งใหม่ ที่ประสบความสำเร็จ!
Rogare

แม้ว่า xcode7 จะใช้งานได้เพียงแค่ใช้แผงควบคุม "Connections inspector" ที่เหมาะสม ถอดเต้าเสียบออกจาก tableviewcell และจากฉลากจากนั้นเพิ่มใหม่อีกครั้งและทุกอย่างจะทำงานได้
lifeisfoo

3
ใช้งานได้ แต่คุณต้องแน่ใจว่า FileOwner ไม่ได้รับการตั้งค่า !! เจ้าของไฟล์ควรยังคงเป็น NSObject stackoverflow.com/questions/13793162/…
devjme

คำตอบเดียวกันช่วยฉันสองครั้ง!
wm.p1us

98

บางครั้งสิ่งนี้เกี่ยวข้องกับ "รับช่วงจากเป้าหมาย" ของคุณซึ่งต้องมีการตั้งค่า ด้วยแอปเป้าหมายเดียวคุณสามารถเลือกรับช่วงจากเป้าหมายได้ หากคุณมีมากกว่าหนึ่งเป้าหมายให้เลือกเป้าหมายที่ต้องการ

ป้อนคำอธิบายรูปภาพที่นี่


คำตอบนี้ช่วยฉันในบางกรณี ฉันต้องทำงานอย่างต่อเนื่องในโครงการ obj-c เก่าที่มีเป้าหมายหลายรายการ ฉันสร้าง UITableViewCell แบบกำหนดเองใน Swift และฉันมีข้อผิดพลาดเดียวกัน ด้วยการเปิดใช้งาน "รับช่วงเป้าหมาย" มันทำงานได้ ขอบคุณ!
magohamoth

โมดูลไม่ได้ตั้งค่าอย่างถูกต้องเสมอไป เช่นถ้าคุณกรอกชื่อคลาสก่อนสร้างคลาสจริง
Johan

ฉันเติมชื่อคลาสโดยไม่ต้องกดปุ่ม "Enter" ในตอนท้ายดังนั้น IDE ไม่ได้ตรวจสอบการตั้งค่าสถานะนี้โดยอัตโนมัติ เสียเวลา 1 ชั่วโมงกับสิ่งนี้ ขอบคุณ.
MatPag

ไม่เคยพบข้อผิดพลาดประเภทนี้ใน obj-c แต่ต้องขอบคุณการไขปริศนานี้
Pradeep Kachhawaha

ทำไมถึงถูกฝังในหน้า 3
Sergio

65

หากเป็นแอป iPhone เท่านั้นไม่ใช่แอปสากลให้ตรวจสอบว่าฟิลด์ต่อไปนี้ว่างเปล่า:

เป้าหมาย> สรุป> ข้อมูลการปรับใช้ iPhone / iPod> อินเทอร์เฟซหลัก

หากคุณระบุ xib จะเกิดปัญหาขึ้น


2
ใช่นั่นคือสำหรับฉัน ในขณะที่เดินไปรอบ ๆ เพื่อเพิ่มคอนโทรลเลอร์มุมมองเริ่มต้นใหม่ฉันตั้งค่านี้เป็นคลาส / ปลายปากกาใหม่ หลังจากเชื่อมต่อกับเต้าเสียบดูฉันก็ตีข้อผิดพลาดนี้ การล้างฟิลด์นี้จะแก้ไข
terriblememory

สิ่งนี้ใช้ได้สำหรับฉัน โปรดทราบว่าฉันต้องลบเวอร์ชันเก่าออกจากอุปกรณ์ / ตัวจำลองเพื่อให้สามารถใช้งานได้
jimt

ขอบคุณ - นี่คือปัญหาของฉัน ฉันได้เปลี่ยนชื่อไฟล์สตอรีบอร์ด iPad ของฉันและไม่ได้อัปเดตในการตั้งค่าของโครงการ
RobertJoseph

2
ขอบคุณ! วิธีนี้แก้ไขได้สำหรับฉัน (ฉันต้องลบแอพออกจากตัวจำลองหลังจากเปลี่ยนฟิลด์ Main Interface ให้ว่างเปล่าเพียงแค่เปลี่ยนฟิลด์นั้นไม่ได้บังคับให้ตัวจำลองหยุดแคช)
snipe

ฉันจำได้ว่าฉันเปลี่ยนสิ่งต่าง ๆ จากแอพสากลเป็นแอพ iphone เท่านั้นและสิ่งนี้แก้ไขข้อผิดพลาด!
Justin

59

ข้อผิดพลาดนี้ระบุว่าวัตถุตัวสร้างอินเตอร์เฟสที่เชื่อมต่ออยู่แล้วจะถูกลบ / เปลี่ยนชื่อในแหล่งที่มาของเจ้าของ (เจ้าของไฟล์)

คลิกควบคุมที่เจ้าของไฟล์ในเครื่องมือสร้างอินเทอร์เฟซหากคุณเห็นเครื่องหมายอัศเจรีย์ที่คุณต้องแก้ไข

ในภาพด้านล่างคุณจะเห็นว่า "aRemovedView" มีเครื่องหมายอัศเจรีย์ทางด้านขวานั่นเป็นเพราะฉันลบวัตถุมุมมอง IBOutlet ขณะที่เชื่อมต่ออยู่ใน IB แล้ว

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้ทำให้เกิดข้อผิดพลาดดังต่อไปนี้: การ ยกเลิกแอปเนื่องจากข้อยกเว้นที่ไม่ได้ตรวจสอบ 'NSUnknownKeyException', เหตุผล: '[setValue: forUndefinedKey:]: คลาสนี้ไม่ใช่ค่าคีย์เข้ารหัสตามคีย์ aRemovedView'


ขอบคุณ! สิ่งนี้แก้ไขได้สำหรับฉัน ฉันได้รับปัญหานี้มาเป็นเวลานานและไม่ทราบวิธีการแก้ไขนอกเหนือจากเริ่มต้นใหม่ นี่คือมันลบ IBOutlets จากตัวควบคุมมุมมอง แต่ไม่ทราบว่าพวกเขายังคงอ้างอิง / เชื่อมโยงในเจ้าของ (ในกรณีนี้ "ดูตัวควบคุม" ในตัวสร้างส่วนต่อประสาน - Xcode 6)
Ira Herman

41

ฉันมีปัญหาเดียวกันและในขณะที่คำตอบของ TechZen อาจน่าทึ่งจริง ๆ ฉันพบว่ามันยากที่จะนำไปใช้กับสถานการณ์ของฉัน

ในที่สุดผมสามารถแก้ไขปัญหาได้โดยการเชื่อมโยงผ่านฉลากควบคุมอยู่ภายใต้วัตถุ (ไฮไลท์ในภาพด้านล่าง) แต่แล้วผ่านทางเจ้าของไฟล์

หวังว่านี่จะช่วยได้

ป้อนคำอธิบายรูปภาพที่นี่


37

ในกรณีของฉันมันเป็นข้อผิดพลาดในซอร์สโค้ดกระดานเรื่องราวทำตามขั้นตอนเหล่านี้:

  1. ก่อนอื่นให้เปิดกระดานเรื่องราวของคุณเป็นซอร์สโค้ด
  2. ค้นหา <connections>
  3. ลบการเชื่อมต่อที่ไม่พึงประสงค์

ตัวอย่างเช่น:

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

อย่างที่คุณเห็นสิ่งเหล่านี้คือการเชื่อมต่อระหว่างชื่อตัวแปรโค้ดของคุณและแท็ก xml ของเค้าโครงกระดานเรื่องราว;)


33

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

การแก้ไขของฉันคล้ายกับ Gerard Grundy ในการสร้าง UITableViewCell แบบกำหนดเองโดยใช้ XIB ฉันได้ใช้ชื่อคลาสแบบกำหนดเองกับเจ้าของไฟล์โดยไม่ได้ตั้งใจแทน UITableViewCell การใช้คลาสกับ UITableViewCell บนผืนผ้าใบและเชื่อมต่อคุณสมบัติ IBOutlet ของฉันกับมันเพื่อแก้ไขปัญหา


Ayyy dag nab it ... ไม่อยากจะเชื่อเลยว่าฉันทำผิดพลาดบ่อยแค่ไหน ขอบคุณ lol
Benjamin

31
  1. คุณจะต้องระบุIBOutletเพียงครั้งเดียวIBOutletป้ายกำกับ ivar ของคุณไม่จำเป็น
  2. คุณกำลังใช้ NIB ของคุณในการยกตัวอย่างUIViewControllerหรือไม่? ในบางจุดคุณควรจะโทร[SecondView initWithNibName:@"yourNibName" bundle:nil];

สิ่งนี้ช่วย! ฉันได้รับข้อผิดพลาดการปฏิบัติตามการเข้ารหัสคีย์ - ค่าเกี่ยวกับคุณสมบัติจากคอนโทรลเลอร์มุมมองอื่น ปรากฎว่าฉันโทร-initWithNibNameด้วยชื่อปลายปากกาที่ไม่ถูกต้อง
jlstrecker

ใช่สิ่งนี้ช่วยฉันด้วย .. ฉันใช้ UIViewController แทน MyCustomeViewController .. แต่นี่เป็นปัญหาแบบลำดับชั้นอาจจะ .. การวิปัสสนาล้มเหลวเพราะพลาดคลาสวัตถุพลาด .. ขอบคุณทุกคน
Futur

ฉันมีปัญหาที่คล้ายกัน รายการ IBAction ที่เหมือนกันสองรายการโดยบังเอิญ ไม่ได้แสดงในรหัสเฉพาะในการคลิกขวาของ UIControl (UIStepper ในกรณีของฉัน) เพียงแค่ลบหนึ่งแก้ไขมัน
เดฟฮับบาร์ด

30

สิ่งนี้เกิดขึ้นกับฉันเฉพาะเมื่อทำการดีบักบนอุปกรณ์ (iPhone) iOS Simulator ใช้งานได้ดี ทำ "ผลิตภัณฑ์ -> ทำความสะอาด" จาก Xcode ดูเหมือนจะแก้ปัญหา แต่ฉันไม่รู้ว่าทำไม


นี่เป็นการแก้ปัญหาของฉัน ปวดหัวเกือบ 3 วัน
user3818576

5
มันให้คำตอบสำหรับคำถาม มีบางอย่างที่เลอะเทอะในปลายปากกาและทำความสะอาดแก้ไขมัน ฉันอ่านและลองทั้งหมดข้างต้นโดยไม่มีประโยชน์จากนั้นจึงทำความสะอาดและหลังจาก 1 ชั่วโมงของการพยายามแก้ไขปัญหา Maj's แก้ไขมัน ฉันชอบที่จะเห็นสิ่งที่อยู่ใน XML ที่อาจทำให้เกิดสิ่งนี้ แต่ฉันได้ย้าย
Levinson เทคโนโลยี

นี่เป็นการแก้ปัญหาแน่นอน - ฉันลองทำตามคำแนะนำมากมายด้านบนและทำความสะอาดโครงการเท่านั้นที่แก้ไขข้อผิดพลาดนี้ซึ่งเริ่มเกิดขึ้นทันที Ugg ...
DustinB

วิธีนี้แก้ไขปัญหาของฉันฉันลองทำตามคำแนะนำด้านบน ดูเหมือนว่าแปลก!
Naveen Shan

23

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกันและขอบคุณ (!!) ถึง Kira จากhttp://www.idev101.comฉันสามารถแก้ปัญหาได้ ฉันพบเว็บไซต์ของเธอหลังจาก googling และซ้อนทับเธรดเหล่านี้ทั้งหมด ตอนนี้ฉันกำลังโพสต์ที่นี่สำหรับโพสต์ถัดไปที่มากับ StackOverFlow และมีความท้าทายแบบเดียวกันกับฉันเนื่องจากบุคคลนั้นจะเข้ามาที่กระทู้นี้ผ่าน Google มากที่สุด

ฉันรู้ว่าฉันทำผิดนี้:

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

แทนสิ่งนี้:

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

ที่ไหน

DeviceViewController

เคยเป็นชื่อของชั้นเรียนของฉันที่รู้จักกันว่า

DeviceViewController.h 
DeviceViewController.m

คุณจะต้อง

"import DeviceViewController.h"

ในการนำไปใช้งาน (.m ไฟล์) ที่คุณต้องการโทรหาเช่น UIViewController อื่น

ฉันไม่เสียใจอย่างแน่นอนถ้าฉันเพียง แต่ระบุว่าชัดเจนสำหรับผู้เริ่มต้นเช่นฉันและอาจลงคะแนนเพราะนี่ไม่เกี่ยวข้องกับคำถาม แต่ฉันกำลังค้นหา 4 (!!?) ชั่วโมงตรงในขณะนี้สำหรับคำตอบข้อความผิดพลาด . ถ้าฉันสามารถสำรองไว้ 1 หรือ 2 คนที่จะดี :)

PS: สำหรับผู้ที่สนใจว่าโค้ดยังคงโหลด UIViewController อื่น ๆ อย่างไร:

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

ขอบคุณสำหรับทุกขั้นตอนที่นั่นฉันใช้ Xcode 5 และไม่รู้วิธีการเพิ่มปากกาด้วยตนเองเพราะคุณสามารถเพิ่มกระดานเรื่องราวได้ตามค่าเริ่มต้น .... ฉันได้รับคำแนะนำบางอย่าง แต่ไม่ละเอียดเท่าของคุณ ช่วยจริงๆ !!
Pittfall

"ฉันทำสิ่งนี้ผิด ... " ขอบคุณไม่ใช่ครั้งแรกที่ฉันใช้จ่ายมากเพราะความผิดพลาดที่โง่มากนี้
tontonCD

23

อาจมาจากข้อเท็จจริงที่ว่าคุณมีการควบคุมการลากและสร้างเต้าเสียบหรือการกระทำและลืมที่จะลบ แม้ว่าคุณจะลบรหัสหรือแม้ว่าคุณได้ทำ cmd + Z เพียงพอคุณจะต้องไปที่ผู้ตรวจสอบการเชื่อมต่อของสตอรี่บอร์ดของคุณและดูว่าการกระทำหรือเต้าเสียบที่คุณสร้างนั้นยังอยู่ที่นี่หรือไม่


ขอบคุณ! ฉันเป็น n00b บน Xcode และใช้เวลาพอสมควรในการค้นหาลิงก์อันธพาล ใน Xcode 9.2 คุณสามารถคลิกขวาที่องค์ประกอบในมุมมองกระดานเรื่องราวและตรวจสอบ "ช่องอ้างอิง"
kunigami

21

ดูคำตอบอื่น ๆ ดูเหมือนว่ามีหลายสิ่งหลายอย่างที่อาจทำให้เกิดข้อผิดพลาดนี้ นี่คืออีกหนึ่ง

ถ้าคุณ

  • มีมุมมองที่กำหนดเอง
  • เพิ่มคุณสมบัติ @IBInspectable
  • แล้วลบมันในภายหลัง

จากนั้นคุณอาจได้รับข้อผิดพลาดคล้ายกับ

ไม่สามารถตั้งค่า (xxx) ผู้ใช้กำหนดคุณสมบัติการตรวจสอบใน [มุมมองที่กำหนดเองของคุณ] ... : คลาสนี้ไม่ได้เป็นค่าคีย์ตามมาตรฐานการเข้ารหัสสำหรับคีย์ [xxx]

วิธีแก้ไขคือการลบคุณสมบัติเดิม

ป้อนคำอธิบายรูปภาพที่นี่

เปิดตัวตรวจสอบตัวตนสำหรับชั้นเรียนของคุณเลือกชื่อคุณสมบัติภายใต้แอททริบิวต์รันไทม์ที่กำหนดโดยผู้ใช้แล้วกดปุ่มลบ (-)


ฉันมาบ่อยมากในหน้านี้ ... เวลานี้วิธีนี้ทำให้มัน! แต่แปลกอย่างที่มันฟังดูคุณสมบัติเก่าที่จะลบเป็นจริงใน ViewController อื่นกว่าจากที่มันเกิดปัญหาฉันไม่รู้ว่าทำไม
Cinn

15

สิ่งนี้เกิดขึ้นกับฉันเมื่อตัวควบคุมมุมมองของฉันมีไฟล์. xib แต่ตอนนี้ถูกสร้างโดยทางโปรแกรม

แม้ว่าฉันได้ลบไฟล์. xib ออกจากโครงการนี้แล้ว ผู้ใช้ iPhone / iPad อาจมีไฟล์. xib สำหรับ viewcontroller นี้

การพยายามโหลดไฟล์. xib มักทำให้เกิดความผิดพลาดนี้:

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

วิธีแก้ปัญหาเมื่อสร้างมันโดยทางโปรแกรมอาจเป็น:

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

12

คุณสมบัติ "โมดูล" ของ View Controller ใน Identity Inspector อาจแตกต่างจากที่คุณคาดไว้ ตรวจสอบให้แน่ใจด้วยว่ามีการเพิ่มคลาสใหม่ในรายการเป้าหมายของคุณ


ออกเสียงลงคะแนนเนื่องจากเป็นเช่นนั้นในกรณีของฉัน ฉันใช้สวิฟท์และสตอรีบอร์ด เมื่อฉันสร้างเป้าหมายบิลด์ใหม่ (เพื่อสร้างบิลด์) แอพไม่ทำงานในตัวแปรใหม่ในขณะที่อันแรกใช้ได้ดี แอปพลิเคชนในมุมมองของตัวควบคุมที่ชื่อโมดูลถูกกำหนดอย่างใดเพื่อโมดูลจากเป้าหมายแรกในขณะที่ในการทำงานดูตัวควบคุมมันเป็นปัจจุบัน - <ชื่อโมดูลที่นี่> คุณต้องลบชื่อโมดูลที่นั่นในกรณีนี้
Mixaz

11

ฉันมีปัญหาที่คล้ายกันสำหรับโครงการที่มีสองเป้าหมาย (ด้วย MainWindow XIB ของตัวเอง) ปัญหาพื้นฐานที่ทำให้เกิดข้อผิดพลาดสำหรับฉันนี้คือคลาส UIViewController ไม่รวมอยู่ในรายการทรัพยากรของโครงการที่สอง ตัวสร้างส่วนต่อประสาน Ie อนุญาตให้ฉันระบุไว้ใน MainWindow.xib แต่ที่รันไทม์ระบบไม่สามารถค้นหาคลาสได้

คือคลิก cmd ที่คลาส UIViewController ในคำถามและตรวจสอบอีกครั้งว่ามันรวมอยู่ในแท็บ 'เป้าหมาย'


9

เพียงเพิ่มไปที่นี้เพราะฉันได้รับข้อผิดพลาดนี้เช่นกัน ทำตามคำตอบทั้งหมดเหล่านี้ส่วนใหญ่ดูเหมือนจะนำไปใช้กับการทำงานกับ UI และเนื้อหาของกระดานเรื่องราว ฉันรู้ว่าโปสเตอร์ดั้งเดิมดูเหมือนว่าจะทำงานกับ UI ได้ แต่เมื่อค้นหาสาเหตุที่เป็นไปได้สำหรับข้อผิดพลาดนี้ส่วนใหญ่คำถามทั้งหมดจะนำกลับมาที่คำถามนี้โดยที่คนอื่น ๆ ถูกปิดเป็นรายการที่ซ้ำกันหรือเพียงแค่มีปัญหา เพิ่มโซลูชันของฉัน

ฉันทำงานเกี่ยวกับการเขียนโปรแกรมเว็บเซอร์วิสใน Swift 2 ฉันได้สร้างวัตถุพร็อกซีและสตับทั้งหมดที่ต้องการ ขณะที่ฉันวนลูปผ่าน XML ที่ส่งคืนฉันได้สร้างอินสแตนซ์วัตถุของฉันแบบไดนามิกซึ่งทั้งหมดมาจากNSObjectและใช้setValue:forKeyกับพวกเขา ทุกครั้งที่setValue:forKeyพยายามตั้งค่าคุณสมบัติจะเกิดข้อผิดพลาดขึ้น

ผมมีคำสั่งสวิทช์สำหรับแต่ละประเภทที่ได้รับการจัดการกับ (เช่นBool?, CShort?, String?) และสำหรับแต่ละโหนด XML setValue:forKeyฉันเดินผ่านและตรวจสอบสิ่งที่ประเภทอยู่บนวัตถุแล้วแปลงค่าเป็นประเภทที่และพยายามที่จะตั้งด้วย

ในที่สุดฉันเริ่มแสดงความคิดเห็นออกsetValue:forKeyบรรทัดเหล่านี้ทั้งหมดและพบว่าdefaultกรณีคำสั่งเปลี่ยนของฉันทำงานString?ได้

ในที่สุดผมก็คิดว่าคุณไม่สามารถใช้ชนิดรวดเร็วจำเป็นกับsetValue:forKeyเว้นแต่จะมีการทำแผนที่โดยตรงไปยังประเภท Objective-C เหมือนหรือString? NSNumber?ฉันสิ้นสุดการเปลี่ยนทุกCShort?ประเภทเป็นNSNumber?เนื่องจากมีการแมปโดยตรง สำหรับBool?ในกรณีของฉันมันจะดีสำหรับผมที่จะใช้เพียงและเริ่มต้นมันBool falseคนอื่นอาจไม่มีความหรูหรานั้น

อย่างไรก็ตามสิ่งที่ปวดหัวซึ่งหวังว่านี่จะช่วยให้คนอื่นที่มีปัญหาคล้ายกันและถูกเปลี่ยนเส้นทางไปยังคำถามนี้และพูดกับตัวเองว่า "ฉันไม่ได้ทำอะไรใน UI !!"

ดังนั้นในที่สุดจะย้ำอีกครั้งหนึ่งการเข้ารหัสคีย์ - ค่าไม่ทำงานกับตัวเลือก ด้านล่างฉันลงเอยด้วยการหาที่ไหนสักแห่ง แต่ฉันลืมที่จะให้ใครก็ตามที่โพสต์สิ่งนี้ฉันขอโทษและจะให้เครดิตถ้าฉันจำได้ว่าที่ฉันพบนี้ แต่มันช่วยชีวิตของฉัน:

คุณไม่สามารถใช้ KVC บนคุณสมบัติ Int ซึ่งเป็นทางเลือกได้เนื่องจาก KVC เป็น Cocoa / Objective-C และ Objective-C ไม่สามารถมองเห็น Int ตัวเลือก - มันไม่ได้เชื่อมโยงกับ Objective-C Objective-C สามารถดูประเภทที่เชื่อมต่อกับ Objective-C เท่านั้น

ชนิดคลาสที่ได้รับมาจาก NSObject

ประเภทคลาสที่เปิดเผยด้วย @objc

Swift structs ที่เชื่อมโยง


1
หากคุณพยายามเชื่อมต่อค่า Swift bool ผ่านการเชื่อมโยงของ Cocoa คุณต้องแสดงด้วย @objc directive มิฉะนั้นคุณจะได้รับข้อผิดพลาดนี้แน่นอน นี่ควรเป็นคำตอบที่ดีที่สุด
jvarela

9

"คลาสนี้ไม่ใช่ค่าคีย์สำหรับการเข้ารหัสสำหรับคีย์" ฉันรู้ว่ามันช้าไปหน่อย แต่คำตอบของฉันแตกต่างกันดังนั้นฉันคิดว่ามันต้องโพสต์ฉันถูกผลักคอนโทรลเลอร์ที่สองในทางที่ผิดนี่คือตัวอย่าง

วิธีที่ไม่ถูกต้องในการพุชคอนโทรลเลอร์

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

วิธีที่ถูกต้อง

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

ฉันไม่พบคำตอบใด ๆ เช่นด้านบนดังนั้นอาจเป็นไปได้ที่จะช่วยคนที่มีปัญหาเดียวกัน


8

อาจเป็นกรณีของการอ้างอิงองค์ประกอบจาก Xib Interface ที่คุณเปลี่ยนชื่อหรือลบ การอ้างอิงอีกครั้งเหมาะกับฉัน


8

ฉันเพิ่งมีปัญหานี้ในโครงการที่ทำซ้ำและแก้ไขได้โดยการตรวจสอบ 2 แห่ง:

1- ตรวจสอบให้แน่ใจว่าคุณมีไฟล์. m ในรายการ -> โครงการ - สร้างเฟส - แหล่งที่คอมไพล์
2- หลังจากนั้นไปที่ตัวสร้างส่วนต่อประสาน (อาจเป็นข้อผิดพลาดที่เกิดขึ้นกับ IB เท่านั้น) และยกเลิกการเชื่อมโยงคุณสมบัติทั้งหมด ฯลฯ ... จากนั้นลิงก์ทั้งหมดอีกครั้ง ฉันรู้ว่าฉันได้ลบแอททริบิวต์ออก แต่มันยังคงลิงก์อยู่ใน IB

หวังว่ามันจะใช้ได้สำหรับบางคน


7

ปัญหาอื่นที่ "ไม่เข้ากัน" ที่ฉันพบคือเมื่อฉันจัดการเพื่อให้มีสองสำเนาของชั้นเรียนด้วยเหตุผลบางอย่าง

ฉันกำลังเพิ่มปุ่มลงในสำเนาที่ไม่ถูกต้อง ตัวสร้างส่วนต่อประสานยังเห็นปุ่มและให้ฉันเชื่อมต่อกับพวกเขา แต่ในขณะใช้งานจริงมันใช้สำเนาอื่นของคลาสที่ไม่มีคีย์ใหม่

ในการค้นหาว่าสำเนาใดที่ "ถูกต้อง" ฉันใช้คำสั่ง cmd ของ XCode ในชื่อชั้นเรียนที่อื่นเพื่อข้ามไปยังสำเนาที่ถูกต้องจากนั้นฉันก็กำจัดสำเนาที่ไม่ได้ใช้ที่ไม่ดีออกไป (หลังจากนำการแก้ไขของฉันออก

คุณธรรมของเรื่องราว: ไฟล์คลาสที่ซ้ำกันไม่ดี


7

ข้อผิดพลาดนี้เป็นอย่างอื่น!

นี่คือวิธีที่ฉันแก้ไขมัน ฉันใช้ xcode เวอร์ชัน 6.1.1 และใช้ swift ฉันได้รับข้อผิดพลาดนี้ทุกครั้งที่แอปของฉันพยายามที่จะทำต่อเพื่อข้ามไปยังหน้าจอถัดไป ที่นี่ฉันทำอะไร

  1. ตรวจสอบว่าปุ่มถูกเชื่อมต่อกับการกระทำที่ถูกต้อง (นี่ไม่ใช่ปัญหา แต่ยังดีต่อการตรวจสอบ)
  2. ตรวจสอบว่าปุ่มไม่มีการกระทำหรือร้านค้าเพิ่มเติมที่คุณอาจสร้างขึ้นโดยไม่ได้ตั้งใจ (นี่ไม่ใช่ปัญหา แต่ยังดีต่อการตรวจสอบ)
  3. ตรวจสอบบันทึกและตรวจสอบให้แน่ใจว่าปุ่มทั้งหมดในหน้าจอถัดไปมีการดำเนินการที่ถูกต้องและหากมีส่วนย่อยใด ๆ ตรวจสอบให้แน่ใจว่าพวกเขามีตัวระบุที่ไม่ซ้ำกัน (นี่เป็นปัญหา)
    • หนึ่งในส่วนย่อยไม่มีตัวระบุเฉพาะ
    • ปุ่มหนึ่งปุ่มมีการกระทำและสองช่องที่ฉันสร้างขึ้นโดยไม่ได้ตั้งใจ
    • ลบร้านค้าเพิ่มเติมใด ๆ และตรวจสอบให้แน่ใจว่าคุณแยกส่วนไปที่หน้าจอถัดไปมีตัวระบุที่ไม่ซ้ำกัน

ไชโย


6

ฉันมีอาการแบบเดียวกัน สาเหตุหลักคือ "การเป็นสมาชิกเป้าหมาย" สำหรับไฟล์ต้นฉบับของฉันไม่ได้ถูกตั้งค่าเป็นเป้าหมายที่ถูกต้อง ฉันถือว่านั่นหมายความว่าชั้นเรียนของฉันจะไม่ถูกสร้างและรวมอยู่ในแอพของฉัน

หากต้องการแก้ไข:

  1. ไฮไลต์ไฟล์. m ของคุณ
  2. ในบานหน้าต่างด้านขวาให้เลือกตัวตรวจสอบไฟล์
  3. ในส่วน "การเป็นสมาชิกเป้าหมาย" ตรวจสอบให้แน่ใจว่าได้เลือกเป้าหมายการสร้างที่เหมาะสมแล้ว

หวังว่านี่จะช่วยให้ใครบางคนที่นั่น


6

หากคุณมีคลาสย่อย UIViewController แบบกำหนดเองที่มี IBOutlets ที่ทำให้เกิดปัญหาชุดขั้นตอนเดียวที่ฉันพบเพื่อกำจัดข้อผิดพลาดนั้นคือ

.1 เปลี่ยนคลาสเป็น UIViewController

.2 ตัดการเชื่อมต่อช่องเสียบทั้งหมด (พวกเขาทั้งหมดจะมีรูปสามเหลี่ยมเตือนสีเหลืองในขณะนี้) - มันอาจจะเพียงพอที่จะตัดการเชื่อมต่อเต้าเสียบที่มีปัญหา

.3 ทำตามขั้นตอนมาตรฐานทั้งหมด - ↑⌘Kลบข้อมูลที่ได้รับ (เสื่อคำอธิษฐานห่วงลูกปัด)

.4 เปิดแอป - ไปที่ฉากที่มีปัญหา

.5 ฆ่าแอพกลับไปที่ Interface Builder เปลี่ยนคลาสกลับไปเป็นชื่อคลาสที่คุณกำหนดเอง

.6 เชื่อมต่อร้านค้าของคุณใหม่

เปิดแอปและตามปกติจะมีการแก้ไขปัญหาการปฏิบัติตามคีย์ - ค่า


สิ่งนี้ใช้ได้เมื่อคัดลอกและวางฉากในตัวแก้ไข Storyboard
Mizmor

5

ในกรณีของฉัน ฉันไม่ได้มีช่องเสียบขาดใน xib-files หลังจากรวมเข้าด้วยกัน

Shift + Command + K

แก้ไขปัญหาของฉัน ฉันทำความสะอาดโครงการและสร้างใหม่


4

ในกรณีของฉันเกิดจากการอ้างอิง Nib ที่ไม่ถูกต้อง:

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

1
เกิดขึ้นกับฉันเมื่อฉันเปลี่ยนชื่อคลาสมุมมองคอนโทรลเลอร์และลืมว่าชื่อปลายปากกาจำเป็นต้องเปลี่ยนด้วย เนื่องจากชื่อปลายปากกาเป็นเพียงสตริงจึงไม่มีข้อผิดพลาดของคอมไพเลอร์
kris

3

ฉันได้รับข้อผิดพลาดนี้กับกระดานเรื่องราว วิธีแก้ปัญหาข้างต้นดูเหมือนจะไม่เป็นปัญหาดังนั้นฉันจึงลงเอยด้วยการลบตัวควบคุมมุมมองและเพิ่มกลับเข้าไปอีกครั้ง (และแน่นอนว่าการเชื่อมต่อส่วนต่อท้ายและมอบหมายคลาสอีกครั้ง) ซึ่งแก้ไข ฉันไม่รู้ว่ามันคืออะไรจริง ๆ แต่ฉันได้เปลี่ยนชื่อคลาสตัวควบคุมมุมมองที่เกี่ยวข้องไม่นานก่อนที่จะเริ่มต้นนี้ดังนั้นอาจจะมีบางอย่างที่ซ่อนอยู่


ฉันได้รับข้อผิดพลาดนี้อีกครั้ง เวลานี้ฉันสร้างตัวควบคุมมุมมองตารางที่ว่างเปล่าใหม่โดยชั้นเรียนของฉันได้รับมอบหมายจากนั้นไม่ได้ใช้งานคนเดียวและย้ายส่วนต่อไป สิ่งนี้ใช้ได้ผล จากนั้นฉันก็ค่อยๆคัดลอกทุกองค์ประกอบในมุมมองไปจนกว่ามันจะล้มเหลวอีกครั้ง คราวนี้ปัญหากลายเป็นว่าฉันได้กำหนด "User Defined Runtime Attributes" สำหรับตัวเลือก (ฉันคิดว่าฉันสามารถใช้มันเพื่อเริ่มต้นตัวเลือกดังนั้นฉันจะไม่ต้องทำในรหัสไม่คิดว่าเป็นไปได้ ) การลบที่แก้ไขปัญหา ข้อผิดพลาดนี้น่ากลัวจริงๆฉันหวังว่ามันจะได้รับการปรับปรุงในรุ่นอนาคต!
สมมาตร

3

ฉันมีปัญหาเดียวกัน ฉันรีเซ็ตเครื่องจำลอง การถอดและเพิ่มปุ่มควบคุม และในที่สุดก็ทำความสะอาด :) ขอบคุณที่กองมากเกินไป บางรหัสของฉันก็โอเคและเริ่มทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.