@IBDesignable 오류 : IB Designables : 자동 레이아웃 상태를 업데이트하지 못했습니다 : 인터페이스 빌더 Cocoa Touch Tool이 충돌했습니다


157

TextField 객체의 기본 위치 인 "자리 표시 자"기능을 추가하는 UITextView의 매우 간단한 하위 클래스가 있습니다. 서브 클래스에 대한 내 코드는 다음과 같습니다.

import UIKit
import Foundation

@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
    @IBInspectable var placeholder: String = "" {
        didSet {
            setPlaceholderText()
        }
    }
    private let placeholderColor: UIColor = UIColor.lightGrayColor()        
    private var textColorCache: UIColor!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.delegate = self
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.delegate = self
    }
    
    func textViewDidBeginEditing(textView: UITextView) {
        if textView.text == placeholder {
            textView.text = ""
            textView.textColor = textColorCache
        }
    }
    
    func textViewDidEndEditing(textView: UITextView) {
        if textView.text == "" && placeholder != "" {
            setPlaceholderText()
        }
    }
    
    func setPlaceholderText() {
        if placeholder != "" {
            if textColorCache == nil { textColorCache = self.textColor }
            self.textColor = placeholderColor
            self.text = placeholder
        }
    }
}

UITextViewIdentity Inspector에서 객체 의 클래스를로 변경 한 후 Attribute Inspector에서 속성을 올바르게 PlaceholderTextView설정할 수 있습니다 Placeholder. 이 코드는 앱을 실행할 때 훌륭하게 작동하지만 인터페이스 작성기에는 자리 표시 자 텍스트를 표시하지 않습니다. 또한 다음과 같은 비 차단 오류가 발생합니다 (디자인 타임에 렌더링되지 않는 이유라고 가정).

오류 : IB 디자인 가능 : 자동 레이아웃 상태를 업데이트하지 못했습니다 : 인터페이스 빌더 Cocoa Touch Tool이 충돌했습니다

오류 : IB 디자인 가능 : PlaceholderTextView의 인스턴스를 렌더링하지 못했습니다.보기를 렌더링하는 데 200ms보다 오래 걸렸습니다. 도면 코드 성능이 저하 될 수 있습니다.

이 오류의 원인을 파악할 수 없습니다. 두 번째 오류는 drawRect ()를 재정의하지 않기 때문에 의미가 없습니다. 어떤 아이디어?


1
이 오류가 발생했습니다. 개체는 테스트 프로젝트에서 잘 작동했지만 내 주요 프로젝트 (테이블)에서는 작동하지 않았습니다. developer.apple.com/library/mac/recipes/… 에 따르면 편집기 선택> 선택한보기 디버그를 선택했습니다. 그런 다음 "뷰를 디버깅 할 수 없습니다"라는 메시지가 표시됩니다. "프레임 워크에 iOS 용 빌드를위한 올바른 빌드 설정이 있는지 확인하십시오." 이 오류로 인해 Google에 아무것도 나타나지 않았습니다.
Matt

답변:


238

Interface Builder Cocoa Touch Tool이 충돌하면 생성 된 충돌 보고서가 있습니다. 이들은에 위치하고 ~/Library/Logs/DiagnosticReports이름이 지정 IBDesignablesAgentCocoaTouch_*.crash됩니다. 내 경우에는 내 코드에서 문제를 식별하는 유용한 스택 추적이 포함되었습니다.


1
감사! 이것은 매우 도움이되었습니다! 충돌 보고서에 대한 정보는 어디서 찾습니까? :)
Ben-G

57
내 경우에는 initFrame(frame: CGRect)정의해야 한다는 것을 알았습니다 . 당신이 당신의 자신의 init방법 을 제공하는 경우 그렇게하십시오 .
트래비스

이것이 가장 좋은 해결책이었습니다. 뷰 중 하나에서 initWithFrame을 구현하지 않았습니다.
HotFudge 일요일

3
나는 진단 보고서를 사용했으며 @Travis가 언급했듯이 init(frame: CGRect)사용자 정의 ini방법 이 있었기 때문에 명시 적으로 재정의 해야했습니다 . 보고서 use of unimplemented initializer 'init(frame:)'바로 아래 Application Specific Information에서 충돌 보고서를 살펴볼 수 있습니다 . 고마워요! 이 답변에서 두 번 승리하십시오!
Chris

4
평소와 같이이 로그 파일은 Console macOS 앱의 User Diagnostic Reports 그룹 에서도 사용할 수 있습니다 .
Paulo Mattos

51

나는 두 번 같은 문제를 겪었다. 펜촉이 뷰에 맞지 않을 때 IBDesignable 펜촉을 스토리 보드에로드 할 때 시작했습니다. 일단 Xcode가 여전히 오류를 낸 것을 수정하면 무작위로 오류가 발생하지 않을 때까지 Xcode를 다시 시작했습니다.

이게 도움이 되길 바란다.

업데이트 : 방금 "Interface Builder Cocoa Touch Tool"이라는 모든 프로세스를 종료하고 Xcode를 다시 시작하면 오류가 사라졌습니다. 이것이 항상 작동하는지 알 수 없습니다.


2
여전히 이유를 이해하지 못하지만 init메서드를 덮어 쓰지 않으면 질문의 일부로 게시 된 코드에 더 이상 IB Designables오류가 표시 되지 않고 자리 표시자가 Interface Builder에서 올바르게 렌더링됩니다.
Willington Vega

2
아마도 이것은 버그이며 수정 될 때까지 기다려야합니다. 아마도 Xcode 6.3에있을 것입니다.
Youssef Moawad 2012 년

3
XCode 7.1.1은 여전히 ​​존재합니다. XCode를 다시 시작해도 문제가 해결되지 않았습니다. Interface Builder Cocoa Touch Tool이라는 모든 프로세스를 수동으로 종료 한 다음 XCode가 충돌하고 다시 시작되어 작동하기 시작했습니다.
Cristian Pena

1
중요한 점 : 실제로 인터페이스 빌더 프로세스를 먼저 종료 한 다음 XCode를 중지하십시오. 문제를 해결하는 다른 방법으로 지속되는 경우
TheEye

2
XCode 8.1이 오류는 여전히 발생합니다. 원래 init 재정의가 없어서 발생하지만 init 추가 후에도 지속됩니다. @TheEye 말한대로 기술 한 다음 다시 시작 엑스 코드와 같은 인터페이스 빌더 프로세스를 종료했다
존 파울러 (John Fowler)

39

필자의 경우, initWithFrame / initWithCoder 메소드에서 다음을 수행하여 뷰를 작성했습니다.

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

Main Bundle 을 사용 하지 말고 클래스 번들 을 사용해야한다고 보입니다 . 그래서 나는 그 코드를 다음과 같이 바꾸었고 효과가있었습니다.

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

어쩌면 이것이 누군가에게 도움이 될 것이라고 생각했습니다.


1
이것은 내 문제도 해결했습니다! @jmoukel 감사합니다!
edopelawi

그 중 하나가 내 문제를 해결했습니다. 남자!!! 이 솔루션을 두 번 살펴 보았지만 "bundleForClass"줄을 알 수 없었습니다. :(
elk_cloner

let bundle = Bundle(for: ValidatingTextField.self)에서 스위프트
Cfr

14

Interface Builder에서 사용자 정의보기를 선택한 다음 Editor, 을 사용할 수 있습니다 Debug Selected Views. IBDesignableAgentCocoaTouch모든 중단 점 (예외 중단 점 포함)이 작동하고 뷰가 충돌하는 위치를 정확하게 식별 할 수 있으면 소위 디버그 세션 이 시작됩니다 .


완전한! 이것은 내 문제도 발견했다 – 잘못된 글꼴. 6 개의 매우 유사한 IBDesignables 중 하나만 실패한 이유를 설명합니다.
zkarj

13

대한 스위프트 - 엑스 코드 (8)

@IBInspectable나에게 문제를 일으킬 때 선택적 값을 기본값으로 추가 하십시오.

작동하지 않습니다.

@IBInspectable var repeatImage: UIImage = UIImage(named:"myImage")!{
      didSet {
       // configureView
      }
}

이것은 작동해야합니다 :

@IBInspectable var repeatImage: UIImage = RepeatImageView.getDefaultImage() {
    didSet {
        // configureView()
    }
}

class func getDefaultImage() -> UIImage {
    if let defaultImage = UIImage(named: "myImage") {
        return defaultImage
    } else {
        return UIImage()
    }
}

@DungTran 어떤 문제에 직면하고 있습니까?
Mohammad Zaid Pathan

1
선택적 처리는 충돌을 방지합니다. 그러나 UIImage (named :)가 일관되게 nil을 반환하는 원인을 알고 있습니까?
ScottyBlades 1

이 코드는 나를 위해 그것을 고정 주석`@objc @available (*, 사용되지 않는, 이름 : "backgroundColor로") @IBInspectable 속성 public var signatureBackgroundColor : UIColor = .white {didSet {의 backgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper

9

디자인 가능한 렌더링과 비슷한 Interface Builder 문제가 발생했습니다.

답변 에서 제안 된 기술을 사용하여 이미지 리터럴 사용에 대한 문제를 추적 할 수있었습니다.

렌더링 충돌

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")

렌더링 충돌 없음

self.backgroundImage.image =  UIImage(named: "rectangleCenter")

당신은 영웅입니다.
nathangitter

왜 이미지 리터럴이 IB와 호환되지 않는지 아십니까? 나는 같은 문제가 있었다.
SwiftsNamesake

6

실제로 스토리 보드의 모든보기에서 일부 기존 사용자 정의 속성 (현재보기에는 유효하지 않음)이 있으면 에이전트가 충돌 할 수 있습니다.

게다가 때로는 Xcode의 불쾌한 버그로 인해 발생합니다. 이를 확인하려면 스토리 보드에있을 때 편집기>보기 자동 새로 고침을 선택 취소 한 다음 다른 파일로 이동하고 프로젝트를 정리하고 다시 시작하십시오. 스토리 보드를 다시 입력 한 후 편집기>보기 새로 고침을 클릭하고 자동으로 다시 확인하십시오. 그도 내 문제를 한 번 해결했습니다.

둘 다 작동하지 않으면 IBDesignable보기에 대해 잘못된 것을 수행 한 것이므로 스토리 보드에서 충돌보기를 선택하고 편집기>보기 디버그를 클릭하여 디버그하십시오.


당신은 하나님의 선물입니다.
andrewcar

4

이것은이 질문의 경우는 아니지만 다른 누군가를 도울 것입니다.

@IBDesignable 클래스에서 두 가지를 모두 구현하지 않은 경우 비슷한 문제가 발생했습니다.

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    // custom setup
}

override init(frame: CGRect) {
    super.init(frame: frame)

    // custom setup
}

항상 두 init 메소드를 모두 구현해야합니다. 코드를 사용하여 뷰를 초기화하고 aDecoder를 사용하여 초기화하면 InterfaceBuilder에서 프레임을 사용하여 초기화가 사용됩니다.
Skodik.o

4

나는 같은 문제가 있었고 'use_frameworks!'를 추가하여 해결했습니다. 내 프로젝트의 Podfile에.

그것이 당신을 돕기를 바랍니다.


내가 JVFloatLabeledTextField이 문제를했을 때 이것은 나를 위해 일한
saswanb

이것은 상당히 오래된 오래된 Obj-C 프로젝트를 채택하여 저에게 효과적이었습니다. 그 후 IB는 크리스마스 트리처럼 빛납니다! 감사합니다.
drew ..

3

내 경우에는 내가 사용하고있는 카르타고 프레임 워크와 관련이 있습니다. Runpath Search Paths 빌드 설정 에 $ (PROJECT_DIR) / Carthage / Build / iOS를 추가해야 했습니다.


다른 모든 게시 된 솔루션을 시도한 후 ... 이것은 나를 위해 일한 유일한 수정이었습니다! 감사!
Joel

3

제 경우에는 OneSignal에 문제가있었습니다. 분명히 버전 2.2.0 이상에 버그가 있습니다. 2.1.6으로 바뀌었고 모든 것이 다시 훌륭합니다!

이것을 확인하십시오 .


1

내가 이것을 디버깅했을 때 UI를 수정하는 클래스가 있다는 것을 알았습니다. 일반적으로 marquelabel은 UILabel의 서브 클래스 또는 UIView를 서브 클래 싱하고 런타임에 UI를 드로잉하고 Autolayout 엔진과 충돌하는 다른 클래스입니다. 이러한 사용자 정의보기에 고정 너비 또는 높이를 지정하십시오. 그래도 문제가 해결되지 않으면 다음 해결책을 시도하십시오.

해결 방법 1 :-주석 해제 #use_frame은 포드 파일 내에서 작동합니다.

해결 방법 2 :-파생 데이터를 삭제하십시오. 1. Xcode의 편집기 창을 닫고 시뮬레이터를 종료하십시오.-> 2. Xcode 환경 설정-> 위치->로 이동하십시오. 3. 파생 데이터 경로를 나타내는 작은 회색 화살표를 클릭하십시오.-> 4. 프로젝트를 선택하십시오.-> 5. 내부의 모든 폴더를 삭제하십시오. -> 6. Xcode를 종료하고 다시여십시오.


1

Podfile 하단에 추가하고 실행하십시오. pod install

# Workaround for Cocoapods issue #7606

    post_install do |installer|
        installer.pods_project.build_configurations.each do |config|
            config.build_settings.delete('CODE_SIGNING_ALLOWED')
            config.build_settings.delete('CODE_SIGNING_REQUIRED')
        end
    end

1

내 끝에이 스크립트를 추가 Podfile하고 pod install다시 수행 하십시오.

post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
        config.build_settings.delete('CODE_SIGNING_ALLOWED')
        config.build_settings.delete('CODE_SIGNING_REQUIRED')
    end
end

1

@ IBDesignable을 만들 때 가장 큰 문제는 cocoapod 파일이 UITests에 포함되어 있지 않은지 확인하는 것입니다.


0

이유는 귀하의 xib가 스토리 보드의 디자인과 크기가 같지 않기 때문입니다. xib의 높이와 너비가 동일한 지 확인하십시오.


0

이 코드 줄이 누락 platform :ios, '7.0' 되어 문제가 해결되었습니다. 포드 파일 의이 줄과 포드 문제를 업데이트하면 해결됩니다.


0

필자는 앱을 실행하지 않았기 때문에 서명 인증서가 누락되어 Xcode가 아직 인증서를 만들지 않았습니다. 앱을 실행하면 IBDesignable렌더링 이 제대로 작동했습니다.


0

다른 개발자로부터 코드를 얻었고이 오류가 발생하는 것과 같습니다. 그냥 뛰어

pod install

이것은 나를 위해 일했습니다. 희망이 있습니다.


0

프로젝트에 추가 된 자산 또는 글꼴을 직접 초기화 UIImage하거나 UIFont사용 하지 않아야 합니다.

나는 항상 private func setUp()@IBDesignable사용자 정의 UI클래스 에서을 만듭니다 . 어떤에서 호출됩니다 init(frame: CGRect), init?(coder aDecoder: NSCoder). 그래서 마침내 setup()다음과 같이 업데이트했습니다 .

private func setUp() {

     //... Doing initial configurations

     // iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
     if let icon = UIImage(named: "IconImageName") {
          iconImageView.image = icon
          iconImageView.frame.size = icon.size
     }

     // nameLabel.font =  UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
     if let font = UIFont(name: "Calibri-Light", size: size) {
          nameLabel.font =  font
     } else {
          nameLabel.font = UIFont.systemFont(ofSize: size) 
     }

     // Doing other stuffs
}

-1

프로젝트의 다른 곳에서 오류가있는 경우 시뮬레이터에서 빌드하고 실행하도록하고 주석을 달고 디자인 가능을 먼저 실행하여 디자인 가능을 업데이트하고 다른 코드의 주석을 해제하십시오. 그것은 나를 위해 작동합니다.

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