[ios] IB_DESIGNABLE, IBInspectable — 인터페이스 빌더가 업데이트되지 않습니다.

다음 코드 세트가 있습니다.

CustomView.h

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface CustomView : UIView

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

@end

CustomView.m

#import "CustomView.h"

@implementation CustomView

- (void)setBorderColor:(UIColor *)borderColor {
    _borderColor = borderColor;
    self.layer.borderColor = borderColor.CGColor;
}

- (void)setBorderWidth:(CGFloat)borderWidth {
    _borderWidth = borderWidth;
    self.layer.borderWidth = borderWidth;
}

- (void)setCornerRadius:(CGFloat)cornerRadius {
    _cornerRadius = cornerRadius;
    self.layer.cornerRadius = cornerRadius;
}

@end

(Swift 참조를 위해이 문제는 Swift 코드에서도 발생했습니다.)

CustomView.swift

@IBDesignable
class CustomView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

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

    @IBInspectable var borderColor : UIColor = UIColor.clearColor() {
        didSet {
            self.layer.borderColor = borderColor.CGColor
        }
    }

    @IBInspectable var borderWidth : CGFloat = 0.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius : CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }
}

UIView스토리 보드의 뷰 컨트롤러에를 추가 하고 하위 클래스를 CustomView.

여기에 이미지 설명 입력

그러면 “Designables”행이 추가됩니다. “업데이트 중”에 멈춰 있고 툴팁에 “대상 빌드 대기 중”이라고 표시됩니다. 이 상태에서 변경되지 않습니다.

속성 검사로 이동하면 다음 속성을 설정할 수 IBInspectable있습니다.

여기에 이미지 설명 입력

일단 설정되면 “사용자 정의 런타임 속성”에도 표시됩니다.

여기에 이미지 설명 입력

그러나 “Designables”상태는 여전히 동일한 툴팁으로 “업데이트 중”이상으로 이동하지 않습니다 (Cmd + B 빌드를 여러 번 시도했지만 아무것도 변경되지 않았습니다).

또한 IBInspectable속성을 설정하면 각 속성에 대한 경고가 표시됩니다.

IBDesignables- “UIView”인스턴스에서 키 경로 “borderColor”에 대한 사용자 정의 런타임 속성을 무시합니다.이 클래스는 키 borderColor에 대해 키-값 코딩을 준수하지 않습니다.

생성 된 경고의 스크린 샷 :

여기에 이미지 설명 입력


키-값 코딩 준수 문제에 대해 잘 알고 있으며 일반적으로 문제를 해결하는 방법을 알고 있지만 여기서이 문제를 해결하는 방법을 이해하지 못합니다. 보기의 ID 검사기에 따르면보기는 “CustomView”입니다 (이러한 속성이없는 일반 “UIView”가 아님). 뷰가 “CustomView”가 아니라면 이러한 디자인 가능한 속성이 Attributes Inspector에 표시되지 않을 것입니다. 그러나 Interface Builder가 이러한 속성을 뷰에 적용하려고하면 뷰의 클래스가 “UIView”라고 생각하고 속성을 적용 할 수 없다고 생각하게됩니다.

도움이 필요하세요? 중요한 세부 사항을 빠뜨린 경우 알려주십시오. 그러나 그만한 가치가있는 부분에 대해서는 이 튜토리얼을 정확하게 따랐 습니다 (ObjC vs Swift 제외). 이 튜토리얼을 다른 컴퓨터에서 정확히 따랐고 매력처럼 작동했다는 점도 주목할 가치가 있습니다.


의견을 바탕으로 .m파일이 포함되어 있지 않아 문제를 일으킬 수 있다고 제안되었습니다 . 나는이 시나리오가 사실이 되려면 내 길을 떠났을 것이라고 생각했지만 어쨌든 확인했습니다.

여기에 이미지 설명 입력

이 작업을 처음 시작했을 때 IB_DESIGNABLE클래스가 다른 UIKit프레임 워크의 일부 여야 한다는 것을 이해하고 있었습니다 . 따라서이 첫 번째 스크린 샷에서 하나의 클래스가있는 “CustomViews”프레임 워크를 설정 한 것을 볼 수 있습니다 CustomView. 별도의 프레임 워크에 있지 않다는 점을 제외하고는 OtherView과 동일한을 만들었습니다 CustomView. 그러나 두 클래스 사이의 스토리 보드에는 동일한 문제가 지속됩니다.

여기 CustomView.mCustomViews프레임 워크 로 빌드하기 위해 포함 되었음을 나타내는 스크린 샷 이 있습니다 .

여기에 이미지 설명 입력

한편, 다음 스크린 샷은 몇 가지 사항을 나타냅니다.

  • CustomViews.framework 메인 프로젝트에 적절하게 포함됩니다.
  • OtherView.m또한 컴파일 소스로 포함되어, 뭔가 잘못 그래서하더라도 CustomView, OtherView그것은 동일한 오류가 발생하지만, 작동합니다.
  • Main.storyboard그리고 LaunchScreen.xib빨간색으로 나타나고있다. 내가 왜 아무 생각이없고, 이유에 사소한 단서하지 않은 LaunchScreen.xib내가 다른 프로젝트보고 후 말할 수 있지만, (I이 파일을 손도 안)해야을, Main.storyboard또한 그 프로젝트에 적색으로 표시하고 난 IB_DESIGNABLE또는 IBInspectable거기 에서 아무것도하지 않습니다 .

여기에 이미지 설명 입력


나는 이것을 여러 번 시도하고 재 시도했습니다. 집에있는 내 컴퓨터에서 매번 작동합니다.이 질문에 설명 된 문제를 집에서 재현 할 수 없습니다. 직장에서는 작동하지 않습니다. 이 질문에 설명 된 문제는 매번 발생합니다.

두 컴퓨터 모두 올해 새로 구입 한 Mac Mini입니다 (새 모델이 아닌 2012 년 후반 모델). 두 컴퓨터 모두 OS X Yosemite 10.10을 실행합니다. 두 컴퓨터 모두 Xcode 버전 6.1을 실행하고 있습니다. 집에서 빌드는 (6A1052d)입니다. 오늘 아침 두 컴퓨터가 동일한 Xcode 빌드를 실행하고 있음을 확인할 수 있습니다.

다른 사람들은 나에게 나쁜 RAM 일 수 있다고 제안했습니다. 그것은 나에게 멀어 보인다. 프로젝트를 여러 번 다시 시작하고 컴퓨터를 여러 번 다시 시작했습니다. 약 6 개월 된 컴퓨터에 불량 RAM이 있고 다른 문제가 발생하고이 문제의 일관성이 떨어질 것 같습니다. 그러나이 정확한 문제는 전체 프로젝트를 처음부터 여러 번 다시 시작하고 컴퓨터에서 전체를 다시 시작하더라도 지속됩니다.


실제로이 프로젝트를 컴파일하고 실행 IBInspectable하면 스토리 보드에 표시 될 것으로 예상하는대로 속성이 있는 사용자 지정 뷰가 실제로 표시 된다는 점에 유의해야 합니다. 그러나 IB_DESIGNABLEIBInspectable지시문이 사용자 정의 런타임 속성으로 생성되기 때문에이 경우에도 마찬가지라고 생각합니다 .



답변

선택한 뷰를 디버깅하라는 chrisco의 제안에 따라 (이미 수행했지만 좋은 측정을 위해 다시 시도했습니다) Editor 메뉴 하단에 몇 가지 다른 옵션이 있음을 알았습니다.

  • 자동으로보기 새로 고침
  • 모든보기 새로 고침

“Refresh All Views”를 클릭하고 Xcode가 약간의 생각을 한 후 갑자기 스토리 보드가 예상대로 내 뷰를 표시했습니다 (제 IBInspectable속성을 올바르게 적용 ).

여기에 이미지 설명 입력

그런 다음 전체 프로세스를 다시 수행하여 이것이 해결책인지 확인했습니다.

새 수업 ThirdView. 이 클래스는 다른 클래스와 동일합니다. ThirdView이번에는 내 뷰의 클래스를로 변경 하고 약간 다른 것을 얻었습니다.

여기에 이미지 설명 입력

경고에 “표시”를 클릭합니다.

여기에 이미지 설명 입력

이번에는 새로운 것 :

ThirdView 클래스가 존재하지 않기 때문에 사용자 정의 클래스가있는 개체에 클래스 UIView를 사용합니다.

이것은 이미 존재했던 것보다 더 도움이되지 않습니다. 또한 이제 다른 세 가지 경고가 이상하게도 6 개로 두 배가되었습니다.

어쨌든 Editor 드롭 다운 메뉴에서 “Refresh All Views”를 다시 클릭하면 모든 오류가 사라지고 다시 한 번 뷰가 제대로 표시됩니다.

그래도 지금까지 내가 한 모든 것은 집에서 한 번도 엉망으로 만든 일이 아니었다. 집에서는 그냥 효과가있었습니다. 그래서 “Automatically Refresh Views”를 켜고 테스트를 위해 “FourthView”를 만들었습니다. 처음 세 개와 동일합니다.

뷰의 클래스를 “FourthView”로 변경 한 후 디자인 가능 레이블은 잠시 “업데이트 중”이라고 말한 다음 마지막으로 “최신”이라고 말했습니다.

여기에 이미지 설명 입력

그래서 집에서 컴퓨터를 확인했습니다. 항상 작동하던 컴퓨터에서 “자동으로보기 새로 고침”이 켜져 있습니다. 그렇지 않은 컴퓨터에서 꺼졌습니다. 이 메뉴 옵션을 만진 기억이 없습니다. 나는 그것이 Xcode 6 이전에 존재했는지 확실하게 말할 수 없습니다. 그러나이 옵션이 차이를 만드는 것입니다.


요컨대, 질문에 설명 된 것과 동일한 문제가있는 경우 “자동으로 뷰 새로 고침”이 켜져 있는지 확인하십시오 (또는 IB에서 업데이트가 필요한 경우 수동으로 “모든 뷰 새로 고침”).

여기에 이미지 설명 입력


답변

IBDesignable 클래스가로드되지 않는 원인이 될 수있는 몇 가지 세부 정보가 더 있습니다.

사용자 정의보기가 표시되어야하는 문제가있는 스토리 보드 / xib를 선택하십시오.

네비게이터 영역에서 XCode 작업 공간 / 프로젝트의 보고서 네비게이터로 이동하십시오.

XCode의 편집기 메뉴에서 (nhgrif에서 언급 한대로) “모든보기 새로 고침”옵션을 누르십시오. 이로 인해 IB는 여러분이 기대하지 않았던 모든 것들에 대한 컴파일을 시작합니다.

보고서 네비게이터에서 “그룹 별”을 클릭하여 컨텐츠를 필터링하고 “인터페이스 빌더”섹션을 확인합니다. 커스텀 IBDesignable 뷰 프레임 워크를로드하기 위해 많은 것들을 컴파일 할 것입니다. 경우 어떤 이러한 목표는 다음 IB 당신의 DLL을 로딩에 실패합니다 (그들은 부하 이러한보기 또는 스토리 보드가있는 코드는 전혀 관련이없는 경우에도) (아마도되지 않음) 같은 단위 테스트 목표를 컴파일하지 않습니다.

필자의 경우 IB는 최근 리팩토링 변경 사항 이후에 업데이트되지 않은 유닛 테스트 4 개를 포함하여 8 개의 타겟을 컴파일하려고했습니다.

대부분의 코드 변경 / 수정은 IB가 이러한 클래스와 관련이 없거나 링크되지 않은 내 커스텀 뷰를 제대로로드하고 표시하기 위해 수행했으며 이러한 단위 테스트를 실행하는 동안 스토리 보드를로드하지도 않습니다. 그러나 IB는 작동하도록 컴파일하는 전체 작업 공간에 의존했습니다.


답변

이 문제가있는 다른 사람을위한 간단한 힌트 : 변수 유형을 지정하는 것을 잊지 마십시오.

// Doesn't show up in IB
@IBInspectable var includeLeftSection = true

// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true


답변

Ignoring user defined runtime attribute for key path ..내 사용자 정의 IBDesignable 뷰 클래스에서 잘못한 것이 없다고 확신하지만 동일한 경고를 받았습니다.

제 경우에는 Xcode 캐시와 관련이 있습니다.

rm -rf ~/Library/Developer/Xcode/DerivedData/*

제거 DerivedData하면 경고가 사라집니다.


답변

다른 사람이 내가 한 것과 같은 이유로 IB Designables 클래스가 존재하지 않는다는 오류에 대해 발생하는 경우. 상위 답변은 내 문제가 아니지만 약간 관련된 문제가 있습니다 …

customModule이라는 스토리 보드 소스 코드에 숨겨진 속성이 있습니다.

예를 들어, 실수로 주 대상에 추가 한 별도의 프레임 워크 내에 ForwardArrow라는 클래스가 있습니다.

따라서 일부 뷰의 XML은 customClass = “ForwardArrow”customModule = “MainTargetNameWasHere”로 끝났습니다.

빌드의 기본 대상에서 제거했을 때 스토리 보드는 MainTargetNameWasHere를 그것이 위치한 프레임 워크 인 CustomViews로 업데이트하지 않았고 클래스 발견 오류가 발생하기 시작했습니다.

그래서 TLDR; IBDesignable이 다른 프레임 워크에있는 경우 스토리 보드의 customModule xml 속성이 올바른 값으로 설정되어 있는지 확인하십시오. 그리고 그것이 전혀 없다면 그것을 추가하십시오.

내 출처의 예 :

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">


답변

내 예로서, 나는 포드를 통해 CheckboxButton 을 사용하고 있었고 여기 질문에 설명 된 동일한 문제가 발생하는 동안 확인란의 그래픽이 스토리 보드에 표시되지 않습니다.

경고 : IB Designables : CheckboxButton 클래스가 없기 때문에 사용자 지정 클래스가있는 개체에 UIView 클래스 사용

경고 : IB Designables : “UIView”인스턴스에서 키 경로 “checkColor”에 대한 사용자 정의 런타임 속성을 무시합니다. 값을 설정하려고 할 때 예외가 발생했습니다. [setValue : forUndefinedKey :] :이 클래스는 키 checkColor에 대해 키 값 코딩을 준수하지 않습니다.

내 문제를 해결하는 방법 은 아래와 같이 CheckboxButton 이라는 이름으로 모듈을 제공하는 것입니다 .

참고 : CheckboxButton 을 사용중인 모듈 이름으로 바꿔야 합니다 .


답변

저는 개인적으로 “-“버튼을 사용하여 ID 검사기에서 콘텐츠를 삭제하여이 문제를 해결했습니다. 사용자 정의 클래스를 제거하고 IB의 콘텐츠를 변경 한 다음 새 사용자 정의 클래스를 추가 할 때 ID 검사기의 디자인 가능한 요소가 제거되지 않고 이로 인해 오류가 발생했습니다. 모든 것을 삭제하고 다시 빌드하십시오.여기에 이미지 설명 입력