Program Tip

@IBDesignable 충돌 에이전트

programtip 2020. 10. 28. 20:35
반응형

@IBDesignable 충돌 에이전트


내 자신의 확장 UIButton클래스를 작성하고 만들면 @IBDesignableInterface Builder에서 두 가지 오류가 발생합니다.

  • Main.storyboard : 오류 : IB Designables : 자동 레이아웃 상태를 업데이트하지 못했습니다. fd가 닫혀서 에이전트가 충돌했습니다.
  • Main.storyboard : 오류 : IB Designables : RandjeUIButton의 인스턴스를 렌더링하지 못했습니다. 에이전트가 충돌했습니다.

내 코드는 다음과 같습니다.

import UIKit

@IBDesignable
class RandjeUIButton: UIButton {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.backgroundColor = UIColor.blackColor()
    }
}

OS X 10.11 베타 2에서 Xcode 7 베타 2에서 작업하고 있습니다. (VM에서 실행 중)


Xcode의 Interface Builder는 클래스가 IB에서 제대로 렌더링되도록 이니셜 라이저를 둘 다 구현 하거나 구현 하지 않아야@IBDesignable 합니다.

구현하는 경우 에도 required init(coder aDecoder: NSCoder)재정의해야합니다 init(frame: CGRect). 그렇지 않으면 Xcode에서 발생한 오류에서 볼 수 있듯이 "에이전트가 충돌합니다".

이렇게하려면 클래스에 다음 코드를 추가하십시오.

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

나는 같은 문제를 만났고 다음과 같이 해결했습니다.

  1. 문제 :

오류 : IB Designables : 자동 레이아웃 상태 업데이트 실패 : 에이전트가 충돌했습니다.

  1. 검사 파일에서 디버그 버튼을 찾아 클릭합니다.

디버그

  1. 그러면 Xcode가 프 롤렘이 어디에 있는지 알려줍니다. 제 경우 IBDesignable에는 수업 전에 포기합니다 .

  2. 그런 다음 청소하고 다시 작성하면 오류가 사라졌습니다.


Xcode 7.3에서는 위의 솔루션 중 어느 것도 저에게 효과가 없었지만이 질문에 대한 대답은 다음과 같습니다. IB Designables의 인스턴스를 렌더링하지 못했습니다 .

  1. 프로젝트에 대한 Xcode 파생 데이터를 지 웁니다. ~ / Library / Developer / Xcode / DerivedData에 있습니다.
  2. ⌘⇧K를 눌러 현재 빌드를 청소하십시오.
  3. 프로젝트 구축
  4. 스토리 보드에서 편집기 메뉴로 이동하여 모든보기 새로 고침을 수행합니다. 빌드가 완료되고 오류가 사라질 때까지 기다립니다.

문제를 해결하기 위해 네 번째 단계를 수행 할 필요가 없었습니다 (그리고 경우에 대비하여 여기에 포함 된 PaintCode-drawRect'd UIView를 스토리 보드에 표시).

@Mojtaba 및 @WeZZard에 대한 크레딧


이를 유발할 수있는 수많은 문제가 있습니다. 콘솔을 실행하고 충돌 보고서를 찾습니다.IBDesignablesCocoaTouch...

valueForKey의미론에 문제가있는 타사 설계 가능 문제를 방금 분류했습니다 .


나를 위해 그것은 나를 사용하지 않았습니다 #if !TARGET_INTERFACE_BUILDER. 기본적으로 번들의 경로에 액세스하는 코드가 있습니다.

Bundle.main.path(forResource: "Foo", ofType: "plist")

문제는 앱이 아닌 IB에서 실행할 때 앱 Bundle.main이 아니라는 것입니다.

(lldb) po Bundle.main
NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)

따라서 이에 대한 대답은 단순히 @IBDesignable UIView코드를주의 깊게 검토 하고 디자인 타임에 실행할 때 의미가없는 #if !TARGET_INTERFACE_BUILDER모든 것 ( CoreLocation예를 들어 호출 )에 사용하는 것입니다.

내가 이것을 디버깅하고 찾은 방법

스토리 보드에서 Editor -> Debug Selected View를 선택 하는 동안을 사용할 때 표시되는 내용입니다 @IBDesignable UIView.

스토리 보드에서 <code> @IBDesignable UIView </ code>를 선택하는 동안 <code> Editor-> Debug Selected View </ code>를 사용할 때 표시되는 내용입니다.

그런 다음 올바른 위치에서 충돌합니다.

디버그 탐색기

제 경우 에는 디자인 타임에 Xcode 인 번들의 파일에서 값을 찾고 있었기 때문에 디자인 타임에 충돌이 발생 initXXXX하는을 수행하고 assert있었습니다.


@IBDesignable로 표시된 클래스에서 UIImage를 사용할 때 정말 중요한 것을 발견했습니다. 클래식 UIImage 초기화는 에이전트를 충돌시킵니다.

let myImage = UIImage(named: String) // crash the agent

해결책은 UIImage의이 초기화 메소드를 사용하는 것입니다.

let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)

작동 코드 예 :

let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))

self는 @IBDesignable 키워드를 사용하는 클래스입니다. Xcode 9.4, Swift 4.1


XCode 10, Swift 4.2

여기서 답을 찾았 습니다

솔루션은 간단했습니다 required init?(coder aDecoder: NSCoder). 사용자 정의 뷰 클래스 메서드 에서 번들이 해결되는 방식을 변경했습니다 .

    Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)

변경해야

let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)

다른 Xcode 설정 시스템에서 코드를 다시여십시오. 제 경우에는 작동했습니다.


이것이 내가이 문제를 해결하는 방법입니다.

  • 콘센트가 제대로 초기화되었는지 확인하십시오.
  • @IBInspectable 속성이 제대로 초기화됩니다.
  • xib 파일에서 File 's owner placeholder, Go to Identity inspector를 클릭하고 기본값이 없는지 확인하십시오.

import UIKit

@IBDesignable class TestView: UIView {
    
    @IBOutlet weak var label: UILabel!
    
    
    @IBInspectable var textLabel1: String? {
        get {
            return label.text
        }
        set {
            label.text = newValue
        }
    }

    
    // MARK: Setup
    
    var view1: UIView!
    var nibName: String = "TestView"
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        xibSetup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        xibSetup()
    }
    
    private func xibSetup() {
        view1 = loadViewFromNib()
        
        view1?.frame = self.bounds
        view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        
        if view1 != nil {
            addSubview(view1!)
            //textLabel1 = "ok"
        }
    }
    
    private func loadViewFromNib() -> UIView? {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        for object in nib.instantiateWithOwner(self, options: nil) {
            if let view: UIView = object as? UIView {
                return view
            }
        }
        return nil
    }
    
    
}

용법:

여기에 이미지 설명 입력


하루 종일 낭비했고 마침내 문제가 해결되었습니다. 여기에 이미지 설명 입력

빌드를 대상으로 8.0으로 선택했고 모든 것을 수정했습니다.

참고 URL : https://stackoverflow.com/questions/31265906/ibdesignable-crashing-agent

반응형