Interface Builder가을 알고 있지만 MyClass
응용 프로그램을 시작할 때 오류가 발생합니다.
이것은 MyClass
라이브러리의 일부일 때 발생 하며 응용 프로그램 대상에서 클래스를 직접 컴파일하면 발생하지 않습니다.
Interface Builder가을 알고 있지만 MyClass
응용 프로그램을 시작할 때 오류가 발생합니다.
이것은 MyClass
라이브러리의 일부일 때 발생 하며 응용 프로그램 대상에서 클래스를 직접 컴파일하면 발생하지 않습니다.
답변:
" 인터페이스 작성기 파일의 알 수없는 클래스 MyClass "오류 에도 불구 하고이 문제는 인터페이스 작성 기와는 관련이 없지만 코드를 직접 사용하지 않기 때문에 클래스를 연결하지 않는 링커와 관련이 있습니다.
.nib 데이터 (.xib에서 컴파일 된)가 런타임에로드 될 MyClass
때 문자열을 사용하여 참조되지만 링커는 코드 기능을 분석하지 않고 코드 존재 만 분석하므로 알 수 없습니다. 다른 소스 파일이 해당 클래스를 참조하지 않기 때문에 링커는 실행 파일을 만들 때 존재하지 않도록 최적화합니다. 따라서 Apple의 코드가 그러한 클래스를로드하려고하면 연관된 코드를 찾을 수없고 경고를 인쇄합니다.
기본적으로 Objective-C 대상에는 -all_load -ObjC
기본적으로 플래그가 설정되어 모든 심볼을 유지합니다. 그러나 나는 C ++ 대상으로 시작했지만 그것을 가지고 있지 않았습니다. 그럼에도 불구하고, 나는 링커를 공격적으로 유지하는 방법을 찾았습니다.
원래 사용했던 핵은 다음과 같은 빈 정적 루틴을 추가하는 것이 었습니다.
+(void)_keepAtLinkTime;
아무것도하지 않지만 한 번만 호출하면됩니다.
int main( int argc, char** argv )
{
[MyClass _keepAtLinkTime];
// Your code.
}
이렇게하면 링커가 클래스 전체를 유지하도록하고 오류가 사라집니다.
jlstrecker가 의견에서 지적했듯이 실제로 _keepAtLinkTime
메소드 를 추가 할 필요는 없습니다 . 다음과 같은 기존 통화를 간단히 호출하십시오.
[MyClass class];
트릭을 수행합니다 (에서 파생 된 한 NSObject
).
물론 코드의 어느 위치에서나 이것을 호출 할 수 있습니다. 도달 할 수없는 코드 일 수도 있습니다. 아이디어는 링커를 MyClass
어딘가에 사용되는 사고 방식으로 속여서 최적화하는 데 너무 공격적이지 않도록하는 것입니다.
뷰의 신속한 정의. 재정의해야합니다 init(coder aDecoder: NSCoder)
. 뷰 컨트롤러의 Objective-C 정의. 그리고 배나무의 펜촉.
수업을 선택하는 Nib 세부 정보 관리자에 모듈 이름을 추가하십시오.
MyClass
. NSObject
처럼 상속 된 메소드를 호출하면 +class
됩니다.
MyClass.m
File Inspector의 Target Membership 섹션에서 필요한 모든 대상을 확인할 수 있습니다 .
Laura가 제안한 내용에 따라이 문제를 해결했지만 파일을 다시 만들 필요는 없었습니다.
XCode 4를 사용하여 프로젝트 네비게이터 에서 불평하는 클래스가 포함 된 .m 파일을 선택하십시오.
View-> Utilities-> Show File Inspector로 이동하십시오
(이것은 .m-file info와 함께 File Inspector 를 오른쪽에 표시합니다 )
열기 대상 회원 섹션과 대상이하는 .m 파일에 대한 선택되어 있는지 확인합니다
내 .m 파일을 프로젝트에 추가했을 때 어떤 이유로 든 기본 대상에 파일을 추가하지 않아서 언급 한 오류가 발생했습니다.
이것은 실제로 인터페이스 빌더와 관련이 없으며 Xcode가 정적 라이브러리에서 심볼을로드하지 않는다는 것입니다. 이 문제를 해결하려면 프로젝트 (및 대상) 빌드 설정 키에 -all_load -ObjC
플래그 를 추가해야 Other Linker Flags
합니다.
Objective-C는 클래스 당 하나의 심볼 만 생성하므로 -ObjC 플래그를 사용하여 링커가 클래스 멤버도로드하도록 강제해야하며 -all_load
링커 플래그 를 추가하여 정적 라이브러리에서 모든 오브젝트를 강제로 포함해야합니다 . 이 플래그를 조만간 건너 뛰면 오류가 발생 unrecognized selector
하거나 여기에서 관찰 한 것과 같은 다른 예외가 발생합니다.
-ObjC
깃발 만 내 경우에 그것을 고쳤다 는 것을 알았다 .
-ObjC
문제를 해결하기에 충분합니다.
나는 오늘 Swift를 사용 하여이 문제에 부딪쳤다.
수업 Model.h + Model.m
을로 변경했습니다 Model.swift
. 이 객체는 인터페이스 빌더에서와 함께 사용되었습니다 class = Model
.
객체를 교체하자마자 클래스를 더 이상로드 할 수 없었습니다.
내가해야 할 일은 IB의 클래스 참조를 다음에서 변경하는 것이 었습니다.
Class = Model
Module =
에
Class = Model
Module = <TARGETNAME>
<TARGETNAME>
빌드 설정에서 찾을 수 있습니다. 생성 된 Swift-Header에 표시되는 이름이기도합니다.#import "TARGETNAME-Swift.h"
Module
이름은 드롭 다운에 바로 있었다. 내 앱의 이름이었습니다.
"ProjectName"으로 이동하여 클릭 한 다음 "Build phases"탭으로 이동 한 다음 "compile source"를 클릭하고 "+"버튼을 클릭하면 "MyClass"를 선택하는 창이 나타납니다. m "파일을 클릭 한 다음"추가 "를 클릭하십시오.
프로젝트를 빌드하고 실행하면 문제가 해결됩니다.
Xcode4 캐시 문제이므로 / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications / 아래의 모든 폴더를 삭제하십시오.
또한 iPhone에서 동일한 문제 테스트가있는 경우 실행하기 전에 이전 앱을 삭제하십시오 ...
행운을 빕니다. 파스칼
때때로 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">
customModule="MyFrameworkName"
. 거대한 +10
내 경우-목표 c 프로젝트에서 신속한 프레임 워크의 클래스를 사용하려고하면이 오류가 발생했습니다. 해결책은 아래와 같이 인터페이스 빌더 / 스토리 보드에서 클래스의 모듈 (빠른 프레임 워크)을 추가하는 것입니다. 다른 것
내 경우에는 존재하지 않는 클래스에 대한 오류가 표시되었습니다! 스토리 보드 파일에 문제가 있다고 생각했습니다. 오류에서 클래스 파일을 인식하지 못하면 다음을 시도하십시오.
1) 숭고한 또는 다른 훌륭한 편집자로 프로젝트를 엽니 다. 언급 된 수업을 검색하십시오. 2) 말하는 모든 비트를 제거하십시오
customClass="UnrecognizedClassName"
3) 저장하십시오. 4) xcode로 돌아가서 프로젝트를 정리하고 지금 실행하십시오.
나를 위해 일했다.
customClass="MyCla"
. 사용자 정의 클래스 할당을 삭제하는 대신 처음에 사용하려는 클래스에 단순히 넣는 것이 현명했습니다. :)
여기에있는 모든 대답이 클래스가 실제로 존재한다고 가정하지 않는다면 대부분이 답변을 추가하고 싶습니다. 링커 / 컴파일러가 너무 멍청하기 때문에 링커에게 존재를 알리는 것입니다. '강제'하기 위해 해킹을 만들거나 존재합니다.
이 메시지가 실제로 존재하지 않는 클래스에 대해 이야기 할 때 내 문제가 발생합니다. 예를 들어 특정 클래스에 대한 지식이없는 이전 자식 수정으로 되돌릴 수 있습니다 . 그러나 컴파일러는 해당 클래스가 ' 존재하지 않습니다 ..
해결책?
당신은 그 후 가야한다
오류를 제거하는 가장 좋은 방법은 다음과 같습니다 1) 클래스 파일을 선택합니다 (하는 .m) 2)에서 " 대상 회원 ", "확인" 프로젝트 이름 항목
class.h 및 .m에서 텍스트를 복사하고 프로젝트에서 해당 클래스 파일을 삭제하고 "Add File"을 사용하여 동일한 이름의 새 class.h 및 .m 파일을 작성하여이 문제를 해결했습니다. 그런 다음 코드를 새 파일에 다시 붙여 넣고 모든 것이 잘 작동했습니다. 어떻게 든 파일을 만들 때 파일이 올바르게 연결되지 않았습니다. 그 후 링커 플래그를 사용할 필요가 없었습니다.
나는 이것을 마침내 고쳤습니다. 다음 코드를 .m 파일에 추가하는 것을 잊었습니다.
@implementation MyTableViewCell
@end
.xib 파일의 요소에 대한 연결이있는 테이블 셀에 대한 자리 표시 자 @interface를 만들었 기 때문에 발생했지만 클래스에 @implementation이 지정되지 않은 경우 Interface Builder에 버그가 있습니다. 찾을 수 없습니다.
나는 다른 포럼에서 .xib를 소스로보고 MyTableViewCell을 내 코드에서 주석 처리 했음에도 불구하고 보는 모든 단계를 거쳤습니다. 시뮬레이터를 재설정하려고했습니다. 심지어 모든 클래스를 인터페이스와 동일한 이름의 별도의 파일로 분리하려고 시도했지만 아무것도 작동하지 않았습니다.
내 경험에 따르면, .h / .m 파일 이름이 @interface 이름과 다른지 여부는 중요하지 않습니다. 하나 이상의 @interface를 포함하는 여러 파일이 있으며 정상적으로 작동합니다.
PPS UITableViewCell 및 UICollectionViewCell이 https://stackoverflow.com/a/22797318/539149 에서 registerClass : forCellWithReuseIdentifier :를 사용하여 컴파일 타임에 오류 를 표시하는 방법과 함께이 오류를 발생시키는 이유에 대한 자세한 설명이 있습니다 .
.xib에 더 이상 존재하지 않는 이전 App Delegate에 대한 링크가 없어서 발생합니다. 이렇게 수정했습니다.
나는이 사이트에 나열된이 답변과 다른 답변을 시도했지만 그중 어느 것도 나를 위해 분류하지 않았습니다. 이 의견 ( http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html )이 도움이되었습니다.
검색 및 검색 및 검색 후 마침내 파일에 숨겨진이 삭제 된 클래스의 이름을 발견했습니다. 마우스 오른쪽 버튼으로 클릭하고 '소스 코드로보기'를 선택하여 X 코드로 인터페이스 빌더 파일을 열어야했습니다. 그런 다음 검색하면
<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
.
프로젝트 설정뿐만 아니라 타겟 설정에서도 -all_load -ObjC 플래그를 추가해야합니다.
나는 스위프트에서 이것을 만났다.
.xib 파일을 프로젝트의 Base.lproj 폴더로 이동하면이 오류가 제거되었습니다.
Xcode 4에서 aaLuminate 앱을 Universal로 변환 할 때이 오류가 발생했습니다.이 앱은 유틸리티 템플릿을 기반으로하며 원래 Xcode 3에서 빌드되었습니다.
시간을 절약하기 위해 iPhone Main 및 Flipside Views를 Universal 앱의 적절한 이름으로 복사했습니다. "인터페이스 빌더 파일의 알 수없는 클래스 x"오류가 발생했습니다. 제 경우에는 XIB 파일이나 대상에 아무것도 없었습니다.
또한 다른 이유로 aaLuminate-Info.plist 파일을 복사했습니다. 이전 키 "Main nib file base name"이 MainWindow로 설정되었습니다.
이 키를 삭제하자마자 문제가 해결되었습니다!
내 경우에는 새 프로젝트를 만든 다음 여러 소스 파일을 삭제하고 동일한 이름의 소스 파일을 작업 프로젝트에서 복사하여 일부 작업을 저장하려고했기 때문에이 오류가 발생했습니다. 또한 RootViewController를 찾는 MainStoryBoard 파일을 복사했습니다. 그러나 원래 RootViewController를 삭제 한 다음 이전 제품에서 RootViewController에 추가했을 때 파일 추가 작업이 위에서 제안한대로 대상 상자를 "확인"하지 못한 것 같습니다. 새로 가져온 모든 ".m"파일을 방문하고 대상 멤버 자격 상자가 선택되어 있는지 확인하면 문제가 해결되었습니다. 무슨 일이 있었는지 이야기 보드 파일은 대상 멤버십이 확인되지 않아 링크에서 "제외 된"클래스를 찾고 있었다고 생각합니다. 대상에 필요한 파일이 파일 관리자의 대상 멤버쉽에 지정되어 있는지 확인하여 트릭을 수행했습니다. 고마워 팻! (위 참조)
RateView가 UIView의 서브 클래스 인 "인터페이스 빌더의 알 수없는 클래스 RateView"가있었습니다. 스토리 보드 장면에 UIView를 드롭하고 사용자 정의 클래스 필드를 RateView로 변경했습니다. 여전히이 오류가 나타납니다.
디버깅하기 위해 클래스 이름을 RateView2로 변경하고 UIView의 사용자 정의 클래스 필드를 제외하고 일치하도록 모든 참조를 변경했습니다. RateView가 누락 된 클래스 인 경우에도 여전히 오류 메시지가 나타납니다. 오류 메시지가 사용자 정의 클래스 필드 값과 관련이 있음을 확인했습니다. 이 값을 RateView2로 변경하고 오류 메시지가 "인터페이스 빌더에서 알 수없는 클래스 RateView2"로 변경되었습니다. 종류의 진행.
마지막으로 File Inspector에서 소스 코드 파일 자체를 검사했습니다. 거기에서 소스 코드 파일 (튜토리얼에서 복사 한)이 내 타겟과 관련이 없음을 발견했습니다. 다시 말해 대상 멤버십이 없었습니다. 클래스의 소스 코드 파일을 대상 앱의 멤버로 만든 상자를 선택했는데 오류 메시지가 사라졌습니다.
대상의 빌드 단계에서 파일을 추가했는데 문제가 해결되었습니다. 파일을 추가하는 단계는 다음에서 내 대답을 참조하십시오.