@IBDesignable 충돌 에이전트
내 자신의 확장 UIButton
클래스를 작성하고 만들면 @IBDesignable
Interface 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)
}
나는 같은 문제를 만났고 다음과 같이 해결했습니다.
- 문제 :
오류 : IB Designables : 자동 레이아웃 상태 업데이트 실패 : 에이전트가 충돌했습니다.
- 검사 파일에서 디버그 버튼을 찾아 클릭합니다.
그러면 Xcode가 프 롤렘이 어디에 있는지 알려줍니다. 제 경우
IBDesignable
에는 수업 전에 포기합니다 .그런 다음 청소하고 다시 작성하면 오류가 사라졌습니다.
Xcode 7.3에서는 위의 솔루션 중 어느 것도 저에게 효과가 없었지만이 질문에 대한 대답은 다음과 같습니다. IB Designables의 인스턴스를 렌더링하지 못했습니다 .
- 프로젝트에 대한 Xcode 파생 데이터를 지 웁니다. ~ / Library / Developer / Xcode / DerivedData에 있습니다.
- ⌘⇧K를 눌러 현재 빌드를 청소하십시오.
- 프로젝트 구축
- 스토리 보드에서 편집기 메뉴로 이동하여 모든보기 새로 고침을 수행합니다. 빌드가 완료되고 오류가 사라질 때까지 기다립니다.
문제를 해결하기 위해 네 번째 단계를 수행 할 필요가 없었습니다 (그리고 경우에 대비하여 여기에 포함 된 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
.
그런 다음 올바른 위치에서 충돌합니다.
제 경우 에는 디자인 타임에 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
'Program Tip' 카테고리의 다른 글
C #에서 부모 양식의 중앙에 자식 양식 표시 (0) | 2020.10.28 |
---|---|
AngularJS orderBy는 ngOptions에서 추적으로 작동하지 않습니까? (0) | 2020.10.28 |
복합 기본 키와 고유 한 개체 ID 필드 (0) | 2020.10.28 |
urllib2를 사용하는 프록시 (0) | 2020.10.28 |
MySQL에서 공백 앞에있는 모든 문자 가져 오기 (0) | 2020.10.28 |