ข้อผิดพลาด“ คลาส <MyClass> ที่ไม่รู้จักในไฟล์เครื่องมือสร้างส่วนติดต่อ” ที่รันไทม์


260

แม้ว่าตัวสร้างส่วนต่อประสานจะรับรู้ถึงสิ่งใดMyClassก็ตามฉันได้รับข้อผิดพลาดเมื่อเริ่มต้นแอปพลิเคชัน

สิ่งนี้เกิดขึ้นเมื่อMyClassเป็นส่วนหนึ่งของไลบรารีและจะไม่เกิดขึ้นหากฉันรวบรวมคลาสโดยตรงในเป้าหมายแอปพลิเคชัน


คุณเชื่อมโยงไปยังห้องสมุดได้อย่างไร
Elise van Looij

ฉันใช้โครงการย่อยที่ต้องพึ่งพาและทำ drag'n'drop จากผลิตภัณฑ์ของโครงการย่อย Xcode ในขั้นตอนการสร้าง "Link Binary With Library" ของเป้าหมายปัจจุบันของฉัน
jhoule

ถ้าชั้นมาจาก CocoaPods นี้อาจช่วยให้github.com/CocoaPods/CocoaPods/issues/491
Protocole

อาจจะเกี่ยวข้อง? stackoverflow.com/a/24924967/511299
Sunkas

คำตอบ:


222

แม้จะมีข้อผิดพลาด" ไม่ทราบคลาส MyClass ในไฟล์เครื่องมือสร้างอินเทอร์เฟซ " แต่ปัญหานี้ไม่มีส่วนเกี่ยวข้องกับตัวสร้างส่วนต่อประสาน แต่มีตัวเชื่อมโยงซึ่งไม่ได้ทำการเชื่อมโยงชั้นเรียนเนื่องจากไม่มีรหัสใช้โดยตรง

เมื่อข้อมูล. nib (รวบรวมจาก. xib) ถูกโหลดที่รันไทม์MyClassมีการอ้างอิงโดยใช้สตริง แต่ตัวเชื่อมโยงไม่ได้วิเคราะห์ฟังก์ชันการใช้งานโค้ดเพียงแค่มีโค้ดอยู่ดังนั้นจึงไม่ทราบ เนื่องจากไม่มีไฟล์ต้นฉบับอื่นอ้างอิงถึงคลาสนั้นตัวลิงก์จะปรับให้เหมาะสมเมื่อไม่มีการดำเนินการ ดังนั้นเมื่อรหัสของ Apple พยายามโหลดคลาสดังกล่าวจะไม่สามารถค้นหารหัสที่เกี่ยวข้องได้และพิมพ์คำเตือน

ตามค่าเริ่มต้นเป้าหมาย Objective-C จะมีการ-all_load -ObjCตั้งค่าสถานะตามค่าเริ่มต้นซึ่งจะเก็บสัญลักษณ์ทั้งหมดไว้ แต่ฉันเริ่มต้นด้วยเป้าหมาย C ++ และไม่มีสิ่งนั้น อย่างไรก็ตามฉันพบวิธีรอบนี้ซึ่งทำให้ linker ก้าวร้าว

แฮ็คที่ฉันใช้อยู่เดิมคือการเพิ่มรูทีนสแตติกที่ว่างเปล่าเช่น:

+(void)_keepAtLinkTime;

ซึ่งไม่ทำอะไรเลย แต่ฉันจะโทรหนึ่งครั้งเช่น:

int main( int argc, char** argv )
{
   [MyClass _keepAtLinkTime];
   // Your code.
}

สิ่งนี้จะบังคับให้ลิงเกอร์เก็บทั้งคลาสและข้อผิดพลาดจะหายไป

ในฐานะที่เป็น jlstrecker ชี้ให้เห็นในความคิดเห็นเราไม่จำเป็นต้องเพิ่ม_keepAtLinkTimeวิธีการจริงๆ เพียงเรียกชื่อที่มีอยู่เช่น:

   [MyClass class];

เคล็ดลับ (ตราบเท่าที่คุณได้รับจากNSObject)

แน่นอนคุณสามารถเรียกสิ่งนี้ในตำแหน่งใด ๆ ของรหัสของคุณ ฉันคิดว่ามันอาจจะเป็นในรหัสที่ไม่สามารถเข้าถึงได้ ความคิดคือการหลอก linker ให้คิดว่าMyClassใช้ที่อื่นเพื่อไม่ให้ก้าวร้าวในการเพิ่มประสิทธิภาพ

Xcode 6.3.2 และ Swift 1.2

นิยามมุมมองที่รวดเร็ว init(coder aDecoder: NSCoder)ให้แน่ใจว่าจะแทนที่ Objective-C definition ของ view controller และปลายปากกาในต้นแพร์

เพิ่มชื่อโมดูลไปยังผู้ตรวจสอบรายละเอียด Nib ที่คุณเลือกชั้นเรียนของคุณ


2
ข้อมูล. xib ไม่ได้ถูกโหลดขณะใช้งานจริง คอมไพเลอร์ IB คอมไพล์ xib ไปยัง nib; ปลายปากกาคือสิ่งที่ถูกโหลดเมื่อรันไทม์
ปีเตอร์ Hosey

19
MyClassคุณไม่ได้มีการปรับเปลี่ยน เพียงแค่เรียกวิธีการสืบทอดจากเช่นNSObject +class
jlstrecker

10
แม้ว่าจะไม่ใช่ Xcode 4 เมื่อมีการโพสต์คำถามดั้งเดิม แต่ดูเหมือนว่าจะเหมาะสมต่อไปนี้ ใน Xcode 4 แทนการเพิ่มวิธีจำลองบางอย่างเพื่อกำจัดข้อผิดพลาดคุณสามารถตรวจสอบเป้าหมายที่จำเป็นทั้งหมดได้MyClass.mในส่วน Target Membership ของ File Inspector
adubr

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

6
@JoshBruce คุณสามารถอธิบายวิธีแก้ปัญหาอย่างรวดเร็วได้หรือไม่ ฉันไม่เข้าใจจริงๆ
Ryan Bobrowski

183

ฉันแก้ไขสิ่งนี้ตามสิ่งที่ลอร่าแนะนำ แต่ฉันไม่จำเป็นต้องสร้างไฟล์ใหม่

  • ใช้ XCode 4 ในProject Navigatorเลือกไฟล์. m ที่มีคลาสที่บ่นเกี่ยวกับ

  • ไปที่ View-> Utilities-> Show File Inspector
    (นี่จะแสดงFile Inspectorทางด้านขวาพร้อมด้วยข้อมูล. m-file นั้น)

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

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


มันเป็นความจริงที่บางครั้งข้อผิดพลาดตัวเชื่อมโยงนั้นเกิดจากการรวบรวมไฟล์ของคุณในเป้าหมายของคุณไม่ได้ สิ่งที่คุณอธิบายคือวิธีควบคุมเป้าหมายที่ไฟล์เชื่อมโยง น่าเสียดายที่ไฟล์ของฉันเป็นส่วนหนึ่งของเป้าหมายแล้ว แต่ฉันยังมีปัญหาในการเชื่อมโยง อาจเป็นเพราะห้องสมุดของฉันมี C ++ (ตรงข้ามกับ Objective-C) ซึ่งมีค่าเริ่มต้นของลิงเกอร์ลิงเกอร์ (ดูโพสต์โดย Alasdair Allan และ Sijo ด้านบน)
jhoule

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

ทางออกที่ยอดเยี่ยมผ่าน Xcode UI @electromaggot, Xcode อาจสับสนเมื่อคุณเพิ่มคลาสด้วยตนเองดังนั้นคุณอาจต้องเพิ่มมากกว่าหนึ่งไฟล์
Gonen

นี่เป็นทางออกสำหรับฉันเช่นกัน ฉันลากไฟล์คลาสบางไฟล์จากโปรเจ็กต์อื่นและไฟล์คลาสเหล่านั้นเป็นไฟล์ที่ยกข้อยกเว้น
hairbo

1
ฉันลบไฟล์จากโครงการของฉันแล้วเพิ่มไฟล์เดิมอีกครั้งในภายหลังและสิ่งนี้แก้ปัญหาได้
MindSpiker

70

สิ่งนี้ไม่มีอะไรเกี่ยวข้องกับเครื่องมือสร้างอินเตอร์เฟสสิ่งที่เกิดขึ้นที่นี่คือสัญลักษณ์ที่ไม่ได้ถูกโหลดจากห้องสมุดแบบคงที่ของคุณโดย Xcode ในการแก้ไขปัญหานี้คุณจะต้องเพิ่มการตั้ง-all_load -ObjCค่าสถานะในOther Linker Flagsคีย์ (และอาจเป็นเป้าหมาย) การตั้งค่าการสร้าง

เนื่องจาก Objective-C สร้างเพียงสัญลักษณ์เดียวต่อคลาสเราจึงต้องบังคับให้ตัวลิงก์โหลดสมาชิกของคลาสด้วยโดยใช้แฟล็ก -ObjC และเราต้องบังคับให้รวมวัตถุทั้งหมดของเราจากไลบรารีแบบคงที่ของเราด้วยการเพิ่ม-all_loadธงลิงเกอร์ หากคุณข้ามการตั้งค่าสถานะเหล่านี้ไม่ช้าก็เร็วคุณจะพบข้อผิดพลาดunrecognized selectorหรือรับข้อยกเว้นอื่น ๆ เช่นสิ่งที่คุณสังเกตเห็นที่นี่


5
ฉันพบว่ามีเพียง-ObjCธงเดียวเท่านั้นที่แก้ไขในกรณีของฉัน
Kekoa

5
@Kekoa นั่นเป็นเพราะ Xcode (LLVM) เวอร์ชันของคุณนั้นล่าสุดกว่าผู้ชายที่ใช้คำตอบนี้ ทุกวันนี้การใช้-ObjCดีพอสำหรับการแก้ไขปัญหา
จนถึง

แค่ช่วยฉันเท่านั้น ในระหว่างการรวบรวมมันแสดงให้เห็นถึงปัญหาที่เกี่ยวข้องกับกรอบซึ่งจำเป็นต้องแก้ไขเมื่อฉันนำเข้ากรอบทั้งหมด
Vaibhav Saran

-ObjC ตั้งค่าสถานะเพียงอย่างเดียวแก้ไขปัญหาของฉัน ฉันมีข้อผิดพลาดในการมีแอตทริบิวต์ all_load ใน iOS7
Sushma Satish

การใช้ -all_load -ObjC อาจทำให้ขนาดผลิตภัณฑ์เพิ่มขึ้นโดยไม่จำเป็น ปัญหานี้เกิดขึ้นกับไฟล์หมวดหมู่ด้วยในกรอบงานเท่านั้น
Ali Amin

26

ฉันพบปัญหานี้ในวันนี้โดยใช้ Swift

ผมเปลี่ยนชั้นเรียนไปModel.h + Model.m Model.swiftวัตถุนี้ถูกใช้ใน Interface Builder class = Modelกับ

ทันทีที่ฉันเปลี่ยนวัตถุคลาสจะไม่สามารถโหลดได้อีกต่อไป

สิ่งที่ฉันต้องทำคือเปลี่ยนการอ้างอิงระดับใน IB จาก:

Class = Model
Module = 

ถึง

Class = Model
Module = <TARGETNAME>

คุณจะพบ<TARGETNAME>ในการตั้งค่าการสร้าง นอกจากนี้ยังเป็นชื่อที่ปรากฏใน Swift-Header ที่คุณสร้างขึ้น:#import "TARGETNAME-Swift.h"


1
นี่ดูเหมือนจะเป็นคำตอบที่ถูกต้อง หากไม่มีใครสามารถพูดเป็นอย่างอื่นได้ควรทำเครื่องหมายว่าถูกต้อง
Bjørn Ruthberg

1
คำตอบที่ดีขอบคุณ สำหรับฉันModuleชื่อถูกต้องในแบบหล่นลง มันเป็นชื่อของแอพของฉัน
ChrisH

มันใช้งานได้สำหรับฉัน สำหรับปัญหาของฉัน <TARGETNAME> พูดถึงในคำตอบของคุณเป็นชื่อของกรอบซึ่งมีชั้นเรียน
Tyler Long

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

สำหรับ AppDelegate ฉันสามารถแก้ไขได้ใน Interface Builder UI สำหรับคลาสที่กำหนดเองขององค์ประกอบ UI ภายในหน้าต่าง UI ของเครื่องมือสร้างอินเตอร์เฟสจะไม่ให้ฉันตั้งค่าคลาสและโมดูลที่กำหนดเอง ฉันต้องทำดังต่อไปนี้: (1) เปิดไฟล์. xib เป็น "ซอร์สโค้ด" (คลิกขวา) (2) เพิ่มแอตทริบิวต์ "customModule = <TARGETNAME>" ถัดจากแอตทริบิวต์ customClass
Poulsbo

20

ไปที่ "ProjectName" คลิกที่มันแล้วไปที่แท็บ "สร้างเฟส" จากนั้นคลิกที่ "รวบรวมแหล่งที่มา" และจากนั้นคลิกที่ปุ่ม "+" หน้าต่างจะปรากฏขึ้นเลือก "MyClass m "ไฟล์จากนั้นคลิก" เพิ่ม "

สร้างโครงการและเรียกใช้ปัญหาจะได้รับการแก้ไขอย่างแน่นอน


ใช่ฉันไม่ได้ตรวจสอบกล่องเป้าหมายทั้งหมดที่ฉันต้องการเพิ่มลงในคลาสที่นำเข้าใหม่ของฉัน ขอบคุณ!
Joel Balmer

ใช่ ไฟล์ VC ของฉันหายไปจากโครงการเป้าหมาย
Sebastian Dwornik

19

เป็นปัญหาแคช Xcode4 เพียงลบโฟลเดอร์ทั้งหมดภายใต้ / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /

นอกจากนี้หากคุณมีปัญหาเดียวกันกับการทดสอบ iPhone ของคุณให้ลบแอปเก่าก่อนเรียกใช้ ...

โชคดี. ปาส


8
ในการตั้งค่าการสร้างโครงการคุณต้องเพิ่มแฟล็ก "-all_load -ObjC" ในคีย์ "Other Linker Flags" นี่ไม่ใช่ปัญหาเฉพาะของ Xcode 4 และโดยทั่วไปแล้วไม่มีส่วนเกี่ยวข้องกับตัวสร้างส่วนติดต่อ
Alasdair Allan

แนะนำวิธีแก้ปัญหานี้แล้วในเดือนมกราคม 2010 (ดูด้านบน)
jhoule

6
ใช่ - วิธีที่ง่ายกว่าในการทำเช่นนี้คือเพียงเปิด iOS Simulator และจากเมนูให้เลือก 'รีเซ็ตเนื้อหาและการตั้งค่า'
RanLearns

หรือคุณสามารถทำสิ่งที่ฉันทำและเพียงแค่ลบแอพที่เป็นปัญหาจากหน้าจอหลักของ Simulator ฉันมีข้อความแสดงข้อผิดพลาดเหมือนกัน แต่เป็นการอ้างอิงตัวแทนแอปเก่า
spstanley

16

บางครั้ง IBuilder พลาด customModule="AppName" customModuleProvider="target"

หากต้องการแก้ไขให้เปิดกระดานเรื่องราวเป็นซอร์สโค้ดและแทนที่บรรทัดนี้:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">

สำหรับสิ่งนี้:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

ใช้ Xcode 6.3 (6D570) ทันทีที่ฉันเรียกใช้การตั้งค่าจะเปลี่ยนกลับเป็นค่าเดิม (ไม่ดี) ข้อผิดพลาด? ฉันกำลังพยายามรวมไฟล์ที่รวดเร็วในโครงการ Objective C
addzo

บน XCode 6.4 เพียงเพิ่ม customModuleProvider = "target" ในซอร์สโค้ดสตอรี่บอร์ดภายใต้ viewcontroller ที่ต้องการแก้ไขปัญหา
Amro Shafie

customModule="MyFrameworkName"ผมสามารถที่จะแก้ไขปัญหาของฉันที่มีเพียง ขนาดใหญ่ 10
สแตน

ที่จริงแล้วปัญหาของฉันตรงกันข้ามฉันต้องการลบ CustomTaget แต่ Xcode ไม่ได้เปลี่ยนไฟล์ต้นฉบับ xib ดังนั้นฉันต้องลบ customModule = "AppName" customModuleProvider = "target" เพื่อให้มันทำงานได้
Adriana

14

กรณีของฉัน - พยายามใช้คลาสจากเฟรมเวิร์กที่รวดเร็วในโครงการ c วัตถุประสงค์ของฉันฉันได้รับข้อผิดพลาดนี้ วิธีแก้ไขคือการเพิ่ม Module (swift framework) ของคลาสใน Interface builder / Storyboard ดังที่แสดงด้านล่าง ไม่มีอะไรอีกแล้ว

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


2
ฉันใช้กรอบ Swift ในโครงการ Swift ที่ติดตั้งโดย CocoaPods วิธีนี้ใช้ได้ผล และชื่อโมดูลคือชื่อของเฟรมเวิร์ก
JsW

1
มันทำงานได้อย่างสมบูรณ์แบบ ต้องการเหตุผลที่โมดูลนั้นถูกลบ?
iSrinivasan27

ทำงานได้อย่างสมบูรณ์แบบด้วย cocoapod frameworks problems ... รุ่งโรจน์สำหรับคุณสำหรับคำตอบที่สมบูรณ์แบบ ...
jayant rawat

13

ไปที่ Build Phases-> Compile Sources และเพิ่มไฟล์. m ใหม่ของคุณ


ใช่หลังจากเพิ่มไฟล์ใหม่จากโครงการก่อนหน้านี้ลงในโครงการ XCode 4.5 การเพิ่มไฟล์. m ไปยังรายการรวบรวมแหล่งที่มาทำให้เสร็จแน่นอน การเพิ่ม "-all_load -ObjC" ไม่ทำงานในกรณีของฉัน แต่ก็ไม่เจ็บ
Whyoz

13

ในกรณีของฉันมันแสดงข้อผิดพลาดสำหรับคลาสที่ไม่มีอยู่จริง! ฉันสงสัยว่ามันเป็นสิ่งที่เกิดขึ้นกับไฟล์สตอรี่บอร์ด หากคุณไม่รู้จักไฟล์คลาสในข้อผิดพลาดให้ลองทำดังนี้:

1) เปิดโครงการของคุณในประเสริฐหรือบรรณาธิการอื่นที่ดี ค้นหาชั้นเรียนที่ถูกอ้างถึง 2) ลบบิตทั้งหมดที่ระบุว่า

customClass="UnrecognizedClassName"

3) บันทึก 4) กลับไปที่ xcode และทำความสะอาดโครงการและลองใช้งานทันที

ทำงานให้ฉัน

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


ฉันใช้แอพ OSX TextEdit มันทำงานได้ดีสำหรับการดำเนินการนี้ อย่าลืมปิดโครงการของคุณก่อนและปิด Xcode
TJ

นั่นก็ช่วยได้เช่นกัน ฉันมีมากกว่าหนึ่งวัตถุที่มี customClass เดียวกันฉันอาจคลิกที่มุมมองแทนตัวควบคุมและกำหนดชื่อเดียวกัน
Mc-

1
นี่เป็นวิธีแก้ปัญหาที่ฉันพบ ก่อนหน้านี้ฉันได้ป้อนชื่อคลาสบางส่วนแล้วกระดานเรื่องราวก็ได้รับการช่วยด้วยวิธีนั้น (เช่นcustomClass="MyCla") แทนการลบการกำหนดชั้นเองมันเป็นที่ชาญฉลาดสำหรับผมที่จะใส่เพียงในชั้นเรียนผมตั้งใจจะใช้ในสถานที่แรก :)
dave

9

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

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

สารละลาย?

  • นุกทุกสิ่ง! ขั้นแรกให้ลบไฟล์ build ทั้งหมดและอื่น ๆ โดยลบเนื้อหาทั้งหมดในไดเรกทอรีนี้ ~ / Library / Developer / Xcode / DerivedData
  • ลบแอพออกจากโทรศัพท์ (และล้างเนื้อหาของตัวจำลองหากคุณใช้ตัวจำลอง)

คุณควรจะดีหลังจากนั้น


2
ไม่สามารถ +1 อันนี้เพียงพอแก้ไขปัญหาของฉัน ปัญหาของฉันตรงกับที่ไฟล์ถูกลบไปแล้ว แต่คำเตือนก็ยังปรากฏเมื่อรวบรวม
Brett

ในกระดานเรื่องราวคุณต้องกรอกรหัสประจำตัว บางครั้งฉันเขียนมันลงในฟิลด์ "คลาส" (ในตัวตรวจสอบตัวตน) โดยไม่ได้ตั้งใจ ดังนั้นคอมไพเลอร์ก็บ่นด้วยเหตุผลว่า Class ไม่มีอยู่จริง!
Vincent

9

วิธีที่ดีที่สุดในการลบข้อผิดพลาดคือ: 1) เลือกไฟล์คลาส (.m) 2) ภายใต้ "การเป็นสมาชิกเป้าหมาย ", "ตรวจสอบ"รายการชื่อโครงการ


วิธีนี้ใช้ได้ผล ฉันกำลังพัฒนาพ็อดและด้วยเหตุผลบางอย่างคำสั่งติดตั้งพ็อดได้ใช้เป้าหมายผิดกับไฟล์คลาสหนึ่ง กำลังถูกนำไปใช้กับชุดทรัพยากรที่ฉันมี การกำหนดค่าที่ถูกต้องคือ Pods- <project-title> - <pod-title>
krosullivan

มันไม่ได้ผลสำหรับฉัน การเป็นสมาชิกเป้าหมายนั้นถูกต้อง แต่ข้อผิดพลาดยังคงเกิดขึ้น
Kokodoko

8

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


1
เมื่อฉันสร้างไฟล์ครั้งแรกฉันไม่มี. m ในตอนท้าย ฉันลองเปลี่ยนชื่อไฟล์และเพิ่มกลับเข้าไปใหม่ แต่ฉันยังต้องลบและสร้างไฟล์ใหม่ก่อนที่ xcode จะมีความสุข
odyth

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

1
โซลูชันนี้ใช้งานได้กับฉันด้วย แต่ฉันมั่นใจ 100% ก่อนที่ฉันจะลบชั้นหนึ่ง (.h + .m) ฉันตรวจสอบว่าเป็นส่วนหนึ่งของเป้าหมายของฉัน นั่นไม่ใช่ปัญหาสำหรับฉัน เช่นเดียวกับลอร่าฉันเพิ่งลบชั้นเรียนและสร้างใหม่อีกครั้ง (ด้วยชื่ออื่น) และใช้งานได้ดีโดยไม่มีวิธีแก้ไขปัญหาอื่น ๆ ในหน้านี้
เนท

7

ฉันแก้ไขมันในที่สุดฉันลืมที่จะเพิ่มรหัสต่อไปนี้ไปยังไฟล์. m ของฉัน:

@implementation MyTableViewCell

@end

ดังนั้นมันจึงเกิดขึ้นเพราะฉันได้สร้างตัวยึด @ อินเทอร์เฟซสำหรับเซลล์ตารางของฉันที่มีการเชื่อมต่อกับองค์ประกอบในไฟล์. xib แต่มีข้อผิดพลาดในตัวสร้างส่วนต่อประสานที่ไม่มีการระบุ @implementation สำหรับชั้นเรียน หาไม่เจอ

ฉันผ่านขั้นตอนทั้งหมดจากฟอรัมอื่นของการดู. xib เป็นซอร์สและเห็น MyTableViewCell แม้ว่าฉันได้คอมเม้นต์มันออกมาจากโค้ดของฉัน ฉันลองรีเซ็ตเครื่องจำลอง ฉันยังพยายามแบ่งชั้นเรียนทั้งหมดของฉันออกเป็นไฟล์แยกต่างหากที่มีชื่อเหมือนกับส่วนต่อประสาน แต่ไม่มีอะไรทำงานจนกระทั่งถึงตอนนี้

PS ในประสบการณ์ของฉันมันไม่สำคัญว่าชื่อของไฟล์. h / .m จะแตกต่างจากชื่อของ @interface ฉันมีไฟล์หลายไฟล์ที่มี @interface มากกว่าหนึ่งไฟล์และทำงานได้ดี

PPS ฉันมีคำอธิบายโดยละเอียดเพิ่มเติมว่าทำไม UITableViewCell และ UICollectionViewCell ทำให้เกิดข้อผิดพลาดนี้ที่https://stackoverflow.com/a/22797318/539149พร้อมกับวิธีการเปิดเผยในเวลารวบรวมโดยใช้ registerClass: forCellWithReuseIdentifier:


6

สิ่งนี้เกิดขึ้นเนื่องจาก. xib มีลิงก์เก่าไปยัง App Delegate เก่าซึ่งไม่มีอยู่อีกต่อไป ฉันคงเช่นนี้:

  • คลิกขวาที่. xib แล้วเลือก Open as> Source code
  • ในไฟล์นี้ค้นหาตัวแทนแอปเก่าและแทนที่ด้วยอันใหม่

เปิดเป็นซอร์สโค้ดไม่มีอีกต่อไป แต่คุณสามารถคลิกขวาได้ง่ายแสดงใน Finder จากนั้นคลิกขวาที่ไฟล์และเปิดใน TextEdit แน่นอนสำรองไฟล์ก่อนที่คุณจะทำการเปลี่ยนแปลงใด ๆ ;)
Scott Allen

6

เพียงแค่เพิ่มรหัสด้านล่างที่จุดเริ่มต้นของวิธีการสมัครผู้สมัครใช้งานวิธีการชำระเงินแล้วมันจะทำงานได้ดี

[คลาส myclass];


5

ฉันลองสิ่งนี้และคำตอบอื่น ๆ ที่ระบุไว้ในเว็บไซต์นี้ซึ่งไม่มีคำตอบใด ๆ ให้ฉัน ความคิดเห็นนี้ (จากhttp://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) ช่วย:

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

<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string>
<string>*this was the class name*</string>

การลบบรรทัดสุดท้ายนั้นไม่สามารถแก้ไขได้อย่างน่าเสียดายโดยบ่นว่ามีจำนวนรายการที่ไม่ถูกต้องในไฟล์ CustomClassคุณจำเป็นต้องลบบรรทัดที่เกี่ยวข้องในส่วนของเส้นข้างต้นนั้นซึ่งหมายถึง


5

ในกรณีของฉันฉันมี XCode6 ซึ่งเป็นไฟล์. m คลาสที่ระบุท้ายสถานที่ที่ผิดในขั้นตอนการสร้าง - มันควรจะอยู่ภายใต้แหล่งรวบรวมแต่ท้ายที่สุดในคัดลอกทรัพยากรบันเดิล


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


4

ปัญหานี้ดูเหมือนจะไม่ล้าสมัย

ฉันมีปัญหาเดียวกันกับ Xcode 8 และแก้ไขมันคล้าย ๆ กับsmilebot :

  1. เปิดไฟล์สตอรีบอร์ดของคุณเป็น "ซอร์สโค้ด" ภายใน Xcode:

  2. ค้นหาคลาสที่ถูกอ้างถึง & ลบทั้งบิตที่ระบุ

customClass = "UnrecognizedClassName"

  1. เปิดไฟล์สตอรี่บอร์ดของคุณเป็น "interfacebuilder - สตอรี่บอร์ด" อีกครั้งและสร้างแอปของคุณใหม่

3

เพียงลบ MyClass.m และ. h และเพิ่มลงในโครงการอีกครั้งก็ใช้งานได้สำหรับฉัน


3

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

การเปลี่ยนสิ่งนี้เป็น "UIButton" แก้ปัญหาได้


2

ฉันวิ่งเข้าไปในนี้ในสวิฟท์

การย้ายไฟล์. xib ไปยังโฟลเดอร์ Base.lproj ของโครงการกำจัดข้อผิดพลาดนี้


ขอบคุณที่แชร์สิ่งนี้ แต่มันก็ไม่ได้ช่วยแก้ปัญหาของฉัน นี่เป็นวิธีแก้ปัญหาที่ฉันค้นพบในที่สุด: stackoverflow.com/a/28760089/456434
Mazyod

2
ฉันพบปัญหาเช่นกัน แต่ในกรณีของฉันชื่อโมดูลที่หายไปนั้นเป็นปัญหา: ดู < stackoverflow.com/a/29013058/784318 >
Besi

1

ฉันมีข้อผิดพลาดนี้หมดไปในวันนี้เมื่อแปลงแอพ aaLuminate ของฉันเป็น Universal ภายใต้ Xcode 4 แอพนี้ขึ้นอยู่กับเทมเพลตยูทิลิตี้และเดิมสร้างขึ้นภายใต้ Xcode 3

เพื่อประหยัดเวลาฉันคัดลอก iPhone Main และ Flipside Views ไปยังชื่อที่เหมาะสมในแอพ Universal ฉันพบข้อผิดพลาด "ไม่รู้จักคลาส x ในไฟล์เครื่องมือสร้างส่วนติดต่อ" ในกรณีของฉันมันไม่มีอะไรในไฟล์ XIB หรือเป้าหมาย

ฉันได้คัดลอกไฟล์ aaLuminate-Info.plist ไปด้วยเหตุผลอื่น - นี่มีคีย์เก่า "ชื่อไฟล์ฐานปลายปากกา" ที่ตั้งเป็น MainWindow

ทันทีที่ฉันลบคีย์นี้มันจะแก้ไขปัญหาได้!


1

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้เพราะฉันพยายามบันทึกงานโดยการสร้างโครงการใหม่จากนั้นลบไฟล์ต้นฉบับหลายไฟล์และคัดลอกไฟล์ต้นฉบับที่มีชื่อเดียวกันจากโครงการทำงาน ฉันยังคัดลอกไฟล์ MainStoryBoard ของฉันซึ่งกำลังมองหา RootViewController ของฉัน อย่างไรก็ตามเมื่อฉันลบ RootViewController ดั้งเดิมแล้วเพิ่มลงใน RootViewController จากผลิตภัณฑ์ก่อนหน้านี้เห็นได้ชัดว่าการดำเนินการเพิ่มไฟล์ล้มเหลวในการ "ตรวจสอบ" กล่องเป้าหมายตามที่แนะนำข้างต้น โดยการเยี่ยมชม newley ทั้งหมดที่นำเข้าไฟล์ ".m" และตรวจสอบให้แน่ใจว่ามีการทำเครื่องหมายในช่องสมาชิกเป้าหมายทุกอย่างดี ฉันคิดว่าสิ่งที่เกิดขึ้นคือไฟล์สตอรีบอร์ดกำลังมองหาชั้นเรียนที่ "แยก" ออกจากลิงก์เนื่องจากไม่ได้เลือกสมาชิกภาพเป้าหมาย ตรวจสอบให้แน่ใจว่าไฟล์ที่จำเป็นสำหรับเป้าหมายนั้นได้รับการกำหนดในการเป็นสมาชิกเป้าหมายในเครื่องมือตรวจสอบไฟล์นั้นได้ทำการหลอกลวง ขอบคุณ Pat! (ดูด้านบน)


1

ในกรณีของฉันมันเป็นเพราะฉันประกาศ subclass ของ subclass ของเซลล์ UITableView ในไฟล์. h (การประกาศของ subclass ทั้งสองอยู่ในไฟล์. h เดียวกัน) แต่ลืมที่จะใช้งานว่างของ subclass ที่สองใน ไฟล์. m

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


1

ฉันมี "RateView ที่ไม่รู้จักในเครื่องมือสร้างอินเทอร์เฟซ" โดยที่ RateView เป็นคลาสย่อยของ UIView ฉันทิ้ง UIView ลงบนฉากสตอรี่บอร์ดของฉันและเปลี่ยนฟิลด์คลาสแบบกำหนดเองเป็น RateView ถึงกระนั้นข้อผิดพลาดนี้ก็ปรากฏขึ้น

ในการแก้ปัญหาฉันเปลี่ยนชื่อคลาสเป็น RateView2 และเปลี่ยนการอ้างอิงทั้งหมดให้ตรงกันยกเว้นฟิลด์คลาสแบบกำหนดเองของ UIView ข้อความแสดงข้อผิดพลาดยังคงปรากฏเป็นมาก่อนด้วย RateView เป็นคลาสที่ขาด สิ่งนี้ยืนยันว่าข้อความแสดงข้อผิดพลาดเกี่ยวข้องกับค่าของฟิลด์คลาสแบบกำหนดเอง ฉันเปลี่ยนค่านี้เป็น RateView2 และข้อความแสดงข้อผิดพลาดเปลี่ยนเป็น "ไม่ทราบคลาส RateView2 ในตัวสร้างส่วนต่อประสาน" ความคืบหน้าของแปลก ๆ

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


1

ในกรณีของฉันฉันได้ลบคลาสที่เรียกว่า "viewController" โดยไม่ทราบว่าถูกเลือกด้วยตัวตรวจสอบตัวตนของสตอรี่บอร์ด (ภายใต้ 'คลาสที่กำหนดเอง' ขึ้นด้านบน)

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

ทำงานให้ฉัน!



1

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

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