cocoa - 사용법 - xcode 인터페이스 빌더




런타임시 인터페이스 빌더 파일의 "알 수없는 클래스<MyClass>"오류 (20)

"ProjectName"으로 이동하여 "빌드 단계"탭으로 이동 한 다음 "소스 컴파일"을 클릭 한 다음 "+"단추를 클릭하면 "MyClass"가 선택됩니다. m "파일을 선택한 다음"추가 "를 클릭하십시오.

프로젝트를 빌드하고 실행하면 문제가 해결됩니다.

Interface Builder는 MyClass 인식하고 있지만 응용 프로그램을 시작할 때 오류가 발생합니다.

이 문제는 MyClass 가 라이브러리의 일부일 때 발생하며 응용 프로그램 대상에서 직접 클래스를 컴파일하면 발생하지 않습니다.


Laura가 제안한 라인을 따라이 파일을 수정했지만 파일을 다시 만들 필요가 없었습니다.

  • Xcode 4를 사용하여 Project Navigator 에서 불평 할 클래스가 들어있는 .m 파일을 선택합니다.

  • 보기 -> 유틸리티 -> 파일 검사기보기로 이동하십시오.
    (오른쪽에있는 파일 관리자 가 .m 파일 정보와 함께 표시됩니다)

  • 대상 구성원 섹션을 열고 대상 이이 .m- 파일에 대해 선택되었는지 확인하십시오

내 .m 파일을 프로젝트에 추가 할 때 어떤 이유에서든 내 기본 대상에 추가하지 않았기 때문에 언급 한 오류가 발생했습니다.


RateView가 UIView의 하위 클래스 인 "Unknown class RateView in Interface Builder"를 사용했습니다. Storyboard 장면에 UIView를 놓고 CustomView 필드를 RateView로 변경했습니다. 그래도이 오류가 나타났습니다.

디버깅하려면 클래스의 이름을 RateView2로 변경하고 UIView의 Custom 클래스 필드를 제외한 모든 참조를 일치하도록 변경했습니다. 오류 메시지는 이전처럼 RateView를 누락 된 클래스로 표시합니다. 오류 메시지가 사용자 지정 클래스 필드의 값과 관련이 있음을 확인했습니다. 이 값을 RateView2로 변경했으며 오류 메시지가 "인터페이스 빌더의 알 수없는 클래스 RateView2"로 변경되었습니다. 종류의 진행.

마지막으로 File Inspector에서 소스 코드 파일 자체를 검사했습니다. 거기서 나는 (내가 튜토리얼에서 복사 한) 소스 코드 파일이 나의 타겟과 관련이 없다는 것을 발견했다. 즉, 대상 회원이 없습니다. 클래스의 소스 코드 파일을 대상 응용 프로그램의 구성원으로 만든 상자를 선택했는데 오류 메시지가 사라졌습니다.



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

나는 '인터페이스 빌더 파일의 알 수없는 클래스 favouritesButton'을 가지고 있으며 문제의 버튼이 Identity Inspector의 맨 위에있는 클래스 필드에 "favouritesButton"의 가짜 커스텀 클래스를 가지고있는 스토리 북 장면까지 추적했습니다. 나는 그 값을 다음 필드에 넣으려고했다.

이것을 "UIButton"으로 변경하면 문제가 해결됩니다.


나는 class.h와 .m에서 텍스트를 복사하고, 프로젝트에서 그 클래스 파일을 삭제하고, "Add File"을 사용하여 같은 이름의 새로운 class.h와 .m 파일을 생성함으로써이를 수정했다. 그런 다음 코드를 새 파일에 다시 붙여 넣으면 모든 것이 훌륭하게 작동했습니다. 어떻게 든 파일을 만들 때 제대로 연결되지 않았습니다. 그 후에 링커 플래그를 사용할 필요가 없었습니다.


나는 스위프트에서 이것을 만났다.

.xib 파일을 프로젝트의 Base.lproj 폴더로 이동하면이 오류가 제거됩니다.


나는 이것을 시험해 보았고, 다른 답변들은이 사이트에 열거되어있다. 이 의견은 ( 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 를 참조하는 위 행의 해당 줄을 제거해야합니다.


내 경우에는 .h 파일에있는 UITableView 셀의 하위 클래스를 선언했기 때문에 (두 하위 클래스의 선언은 모두 동일한 .h 파일에 있음), 두 번째 하위 클래스의 빈 구현을 .m 파일.

.h 파일에서 선언 한 서브 클래스의 서브 클래스를 구현하는 것을 잊지 마십시오! .h / .m 파일 당 하나의 클래스로 작업하는 경우 Xcode가이를 수행하므로 간단하지만 잊기 쉽습니다.


내 경우에는 새로운 프로젝트를 생성 한 다음 소스 파일 중 몇 개를 삭제하고 작업 프로젝트에서 같은 이름의 소스 파일을 복사하여 일부 작업을 저장하려고했기 때문에이 오류가 발생했습니다. 내 RootViewController를 찾고 있던 MainStoryBoard 파일도 복사했습니다. 그러나 원래 RootViewController를 삭제하고 이전 제품의 RootViewController에 추가 한 경우 파일 추가 작업에서 위에 제안 된대로 대상 상자를 "확인"하지 못했습니다. newley가 가져온 ".m"파일을 모두 모방하여 대상 멤버십 상자가 선택되었는지 확인함으로써 모든 것이 잘되었습니다. 무슨 일이 일어 났는지는 스토리 보드 파일이 대상 멤버십이 선택되지 않았기 때문에 링크에서 "제외"된 클래스를 찾고 있다는 것입니다. 대상에 필요한 파일이 파일 관리자의 대상 구성원에 그렇게 지정되었는지 확인하는 것이 트릭을 수행합니다. 감사합니다 팻! (위 참조)


런타임에 인쇄 된 " 인터페이스 빌더 파일의 알 수없는 클래스 MyClass "오류에도 불구하고이 문제는 인터페이스 작성기와 관련이 없으며 코드를 직접 사용하지 않으므로 클래스를 연결하지 않는 링커와 관련이 있습니다.

.xib 데이터 (.xib에서 컴파일 됨)가 런타임에로드되면 MyClass 는 문자열을 사용하여 참조되지만 링커는 코드 기능을 분석하지 않고 코드 존재를 분석하므로 알지 못합니다. 이 클래스를 참조하는 다른 소스 파일이 없으므로 링커는 실행 파일을 만들 때이를 최적화합니다. 그래서 애플의 코드가 그런 클래스를로드하려고 할 때, 관련된 코드를 찾을 수없고, 경고를 출력합니다.

기본적으로 Objective-C 타겟에는 기본적으로 -all_load -ObjC 플래그가 설정되어 모든 심볼이 유지됩니다. 그러나 나는 C ++ 타겟으로 시작 했었고, 그렇게하지 않았다. 그럼에도 불구하고 링커를 공격적으로 유지하는 방법을 발견했습니다.

원래 내가 사용한 해킹은 다음과 같은 빈 정적 루틴을 추가하는 것이 었습니다.

+(void)_keepAtLinkTime;

그것은 아무것도하지 않지만, 나는 다음과 같이 한번 부르겠다.

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

이렇게하면 링커가 전체 클래스를 유지하게되고 오류가 사라집니다.

jlstrecker는 주석에서 지적했듯이 _keepAtLinkTime 메서드를 추가 할 필요가 없습니다. 다음과 같이 기존 전화를 호출하기 만하면됩니다.

   [MyClass class];

( NSObject 에서 파생 된 한) 트릭을 수행합니다.

물론 코드의 어느 위치에서나 호출 할 수 있습니다. 나는 그것이 도달 할 수없는 코드에있을 수도 있다고 생각한다. 아이디어는 링커가 MyClass 가 어딘가에서 사용되어서 최적화가 너무 공격적이지 않다고 생각하도록 속이는 것입니다.

Xcode 6.3.2 및 Swift 1.2

보기의 신속한 정의. init(coder aDecoder: NSCoder) 반드시 오버라이드하십시오. View Controller의 목표 -C 정의. 그리고 배나무에있는 펜촉.

수업을 선택하는 Nib 세부 정보 관리자에 모듈 이름을 추가하십시오.


마침내 이것을 고쳤습니다. .m 파일에 다음 코드를 추가하는 것을 잊었습니다.

@implementation MyTableViewCell

@end

그래서 그것은 .xib 파일의 요소에 연결되어있는 테이블 셀의 자리 표시 자 @interface를 만들었 기 때문에 발생합니다.하지만 인터페이스 작성기에 버그가있어 @implementation이 클래스에 지정되지 않은 경우, 그것을 찾을 수 없습니다.

.xib를 소스로보고 MyTableViewCell을 보는 다른 포럼의 모든 단계를 거쳤지만 코드에서 주석을 제거했습니다. 나는 시뮬레이터를 재설정하려고 시도했다. 나는 심지어 모든 클래스를 인터페이스와 같은 이름의 개별 파일로 분리하려고 시도했지만이 때까지는 아무 것도 작동하지 않았습니다.

추신 : 내 경험에 의하면 .h / .m 파일의 이름이 @interface의 이름과 다른지는 중요하지 않습니다. 하나 이상의 @interface를 포함하는 파일이 여러 개 있는데 잘 작동합니다.

PPS 나는 UITableViewCell과 UICollectionViewCell이 왜이 에러를 https://.com/a/22797318/539149 에서 발생시키는 지에 대한 자세한 설명과 함께 registerClass : forCellWithReuseIdentifier :를 사용하여 컴파일 타임에이를 표시하는 방법을 설명합니다.


오류를 제거하는 가장 좋은 방법은 다음과 같습니다. 1) 클래스 파일 (.m)을 선택합니다. 2) " 대상 멤버쉽 " 에서 프로젝트 이름 항목을 "확인" 합니다


이 답변을 추가하고 싶습니다. 대부분의 대답이 아니라면 여기에 클래스가 실제로 있다고 가정합니다. 링커 / 컴파일러가 너무 멍청해서 대답을 보지 못했습니다. 링커에게 존재를 알리거나 클래스의 또는 강제로 해킹을 만드는 것은 존재합니다 ..

내 문제는이 메시지가 실제로 존재하지 않는 클래스에 대해 이야기 할 때 발생합니다. 그래서 어떤 클래스에 대해 알지 못하는 오래된 git 리비전으로 돌아가는 예가 될 것입니다. 그러나 컴파일러는 클래스가 ' 없어.

해결책?

  • 모든 것이 Nuke 이야! 먼저이 디렉토리의 모든 내용을 삭제하여 모든 빌드 파일 등을 삭제 하십시오 ~ / Library / Developer / Xcode / DerivedData
  • 전화 자체에서 앱을 삭제합니다 (시뮬레이터를 사용하는 경우 시뮬레이터 내용을 지우십시오).

너는 그 후에 나아가 야한다.


이것은 .xib가 더 이상 존재하지 않는 이전 App Delegate에 대한 부실 링크를 가지고 있기 때문에 발생합니다. 나는 이렇게 고정시켰다 :

  • .xib를 마우스 오른쪽 단추로 클릭하고 Open as> Source code를 선택하십시오.
  • 이 파일에서 이전 App Delegate를 검색하여 새로운 App Delegate로 대체하십시오.

이것은 Interface Builder와 아무 관련이 없습니다. 여기서 Xcode가 정적 라이브러리에서 심볼을로드하지 않고 있습니다. 이 문제를 해결하려면 Other Linker Flags 키에 -all_load -ObjC 플래그를 추가해야 프로젝트 (및 가능한 경우 대상) 빌드 설정이 -all_load -ObjC .

Objective-C는 클래스 당 하나의 심볼만을 생성하기 때문에 링커가 -ObjC 플래그를 사용하여 클래스의 멤버를 강제로로드해야하며 -all_load 링커를 추가하여 정적 라이브러리의 모든 객체를 포함시켜야합니다 깃발. 조만간 이러한 플래그를 건너 뛰면 unrecognized selector 의 오류가 발생하거나 여기에서 관찰 한 것과 같은 다른 예외가 발생합니다.


제 경우에는 "viewController"라는 클래스를 삭제했는데 스토리 보드의 ID 관리자 (맨 위의 '사용자 정의 클래스'아래)에서 선택되었음을 알지 못합니다.

신원 검사기의 사용자 정의 클래스 필드에서보기 컨트롤러에 대한 올바른 클래스를 선택하거나 프로젝트에 새 클래스를 추가하고 해당 클래스를 사용자 정의 클래스로 선택하기 만하면됩니다.

나를 위해 일했다!






interface-builder