IBNSLayoutConstraint라는 클래스를 인스턴스화 할 수 없습니다.


81

저는 XCode6 베타를 사용하고 있으며 Swift를 사용하고 있습니다. 뷰 컨트롤러에 일부 자동 레이아웃 제약 조건을 설정하면 앱이 다음 오류와 함께 충돌합니다. Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'


여기에 넣을 코드는 많지 않습니다. :) 뷰 컨트롤러는 몇 개의 콘센트와 일반 viewDidLoad 및 didReceiveMemoryWarning이있는 새로 생성 된 정기적 인 UIViewController입니다. 그리고 Interface Builder에는 제약이 있습니다. 여기에 뷰 컨트롤러 코드를 추가 할 수있을 것 같습니다.
zbrox

답변:


221

런타임에 제거되는 IBOutlet에 제약 조건을 설정했기 때문에이 오류가 발생합니다. 이것은 Interface Builder에서 제약 조건을 자리 표시 자로 설정할 때 발생합니다. 제약 조건이 제거되었으므로 아카이브를 취소 할 때 그렇게 할 수 없다는 오류가 발생합니다.

이를 수정하는 방법에는 두 가지가 있습니다.

방법 1

  1. 스토리 보드를 마우스 오른쪽 버튼으로 클릭> 다른 이름으로 열기> 소스 코드
  2. 열린 스토리 보드 xml에서 placeholder="YES".
  3. 런타임에 제거되도록 설정된 제약 조건을 찾을 수 있습니다. 제약 조건에서 자리 표시 자 속성을 제거하고 저장 한 후 닫습니다.
  4. 앱을 실행하면 문제가 해결 될 것입니다.

방법 2

  1. Interface Builder에서 문제를 일으키는 제약 조건을 찾으십시오. GUI에서 Placeholder 옵션을 선택 취소하십시오. 이것은 충돌을 일으키는 ViewController의 IBOutlet에 설정된 제약 조건 중 하나 여야합니다.

Placeholder 옵션이 선택된 인터페이스 빌더 속성 편집기.

다음과 같이 표시되어야합니다.

플레이스 홀더 옵션이 선택되지 않은 인터페이스 빌더 속성 편집기.

대안

실제로 제약 조건이 자리 표시자가되기를 원한다고 가정하면 참조하는 콘센트를 제거해야합니다. 이렇게하려면 자리 표시자가 될 제약 조건을 선택합니다. 그런 다음 연결 검사기를 열고 (오른쪽에서 가장 먼 버튼 : (->)) 해당 제약 조건에있을 수있는 참조 출력을 제거합니다.


1
제약 조건이 자리 표시자가되도록하려면 어떻게해야합니까? developer.apple.com/library/ios/documentation/UserExperience/...
다니엘 Galasko

2
@DanielGalasko 자리 표시자가 되려면 IBOutlet에 할당하지 마십시오.
Sandy Chapman 2014

@SandyChapman 맞아요! 감사합니다. Sandy, 내가 찬성 할 수 있도록 답변에 포함 해 주시겠습니까?
Daniel Galasko 2014

1
@DanielGalasko, 물론입니다. 좋은 지적입니다. 제 대답은 IBOutlet에 대한 제약 조건을 원한다고 가정했습니다.
Sandy Chapman

@SandyChapman : 어떤 제약이이 문제를 일으키는 지 알아내는 방법이 있습니까? 내 프로젝트가 너무 커서 각각을 통과 할 수 없으며 스택 덤프가 어떤 제약 조건을 가리키는 핀이 아닙니다. 또한 placeholder = "YES"를 찾으려고했지만 xml에서 찾을 수 없습니다.
EmbCoder

6

나는 지금 막 같은 문제가 있었고 다음은 나를 위해 일했습니다.

내 앱의 작동하는 버전을 App Store에 출시하고 며칠 후 UITabBarController에서 내 탭 중 하나를 탭하여 다시 작업을 시작했는데 오류로 인해 충돌이 발생했습니다.

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

내가 알고있는 자리 표시 자 레이아웃 제약이나 정의하지 말아야 할 제약 아웃렛이 없었습니다.

나를위한 해결책은 단순히 크기 클래스를 끄고 iPhone 용 크기 클래스 데이터를 유지하는 것입니다 (앱은 iPhone 전용 임). 이것은 내가 크기 클래스에서 놓친 모든 것을 삭제했을 것입니다. 크기 클래스를 원해서 다시 켜고 앱이 다시 작동했습니다.


게시물 주셔서 감사합니다! 똑같은 경험을했지만 앱에서 아무것도 변경하지 않았습니다. 제 경우에는 'UIPageViewController'를로드 할 때 충돌이 발생했습니다. 크기 클래스를 끄고 다시 활성화하면 오류가 해결되었습니다.
nor0x

감사합니다!! nor0x와 동일한 경험. 매우 이상하지만 여기서 해결책을 찾는 것은 매우 훌륭합니다.
Andy Weinstein

4

이것은 반드시 제약 문제가 아닐 수도 있습니다. 내 레이아웃에 적용되는 크기 클래스에 대해 "설치됨"을 선택하지 않았기 때문에 발생했습니다. 여기를 참조하십시오.설치를 확인해야합니다


1

크기 클래스 사용에 문제가 있습니다. 스토리 보드 속성에서 해당 옵션을 비활성화하고 자동 레이아웃 만 사용합니다. 아이폰 전용 앱이라 큰 문제는 아니었다.


"크기 클래스"를 비활성화하고 실행하면 나에게도 해결되었습니다. 그런 다음 크기 클래스를 다시 활성화하고 계속 작동했습니다.
John Fowler

1

결국 내게 일어난 일은 Interface Builder 내부에서 하위 뷰를 잘라서 다른 xib에 복사하는 것입니다. 이로 인해 원래 xib 인터페이스 빌더의 하위 뷰가 회색으로 표시됩니다. 원래 위치에서 하위보기를 제거한 후 (선택 및 삭제). 오류를 없앨 수있었습니다.


0

"자동 레이아웃 사용"이라는 검사기의 "검사자에게 파일 표시"에서 제한을 사용하지 않는 xib 파일을 선택할 때 검사기 창에 옵션이 있습니다.


저도 알고 있지만 해당 스토리 보드에 자동 레이아웃을 사용하고 싶습니다.
zbrox


감사. 나는 그것들을 가지고 놀아 보았지만 크기 클래스를 사용했기 때문에 실제로 도움이되지 않았습니다. 그러나 나는 이것을 읽고 내가 무언가를 놓쳤는 지 볼 것입니다. 다시 한 번 감사드립니다.
zbrox

0

스크롤 뷰를 변경하여 Stackoverflow의 다른 곳에서 찾은 솔루션을 사용하여 포함 된 선택기 컨트롤이 제대로 작동하도록했습니다. 내 새 스토리 보드는 단순히 이러한 속성을 스크롤 뷰에 추가했습니다.

     delaysContentTouches="NO" canCancelContentTouches="NO"

그러나 또한 다른 장면의 스토리 보드에서 다음과 같은 새로운 조각을 보았습니다.

                    <variation key="default">
                        <mask key="subviews">
                            <exclude reference="86H-aM-wei"/>
                        </mask>
                    </variation>

나는 그것이 어디서 왔는지 모른다. 처음에는 모든 것이 내 개발 컴퓨터에서 찾을 수 있기 때문에 무시했습니다. 그러나 빌드가 릴리스로 빌드되고 테스트되었을 때 충돌이 발생했습니다. 그 가짜 (?) 조각을 제거하면 크래시가 수정되었으며 다른 것에 영향을 미치지 않는 것 같습니다.


0

사용자 지정 UICollectionViewCell에 단추가 있고 해당 클래스의 IBOutlets와 같은 제약 조건이있을 때이 문제가 발생했습니다. 버튼을 셀에서 부모 뷰 컨트롤러로 옮겼고 IBOutlets는 여전히 셀에서 참조되었지만 실제로는 셀에 존재하지 않았기 때문에 모든 것을 날려 버렸습니다. IBOutlets를 제거하기 만하면 모든 것이 다시 정상적으로 작동합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.