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.