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


91

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

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지시문이 사용자 정의 런타임 속성으로 생성되기 때문에이 경우에도 마찬가지라고 생각합니다 .


글쎄, 그것은 단지 아이디어였습니다. 대상에서 CustomView.m을 제거한 다음 앱을 실행할 때 비슷한 경고가 표시되었습니다.
Martin R

겉보기에 똑같은 기계 (어쨌든 다름)와 비교하면 진짜 그렘린처럼 보입니다. devforums에 게시 해 보셨나요? 추가 정보없이 눈을 멀게하는 것 같고 그 과정은 합리적이고 합리적으로 보입니다. "빌드"경고는 Xcode가 오해의 소지가있는 오류 메시지로 가득 차 있기 때문에 너무 많은 것을 의미하지 않을 수 있습니다. 하지만 킥을 위해 Editor-> "debug selected view"를 사용해 보셨죠? (아마도 작동하지 않지만 온 전성 검사가 필요합니다). 또한 (로깅) 콘솔 앱에 표시되는 것이 있습니까?
Chris Conover 2014

같은 문제가 있습니다. IB_DESIGNABLE을 포함하는 단일 xib 파일로 채굴합니다. 그러나 내 설정을 확인하면 이미 자동 새로 고침이 켜져 있으며 이제 수동 새로 고침을 시도하고 파생 된 데이터를 먼저 지우는 등의 작업을 수행했습니다. 지금까지 아무 것도 작동하지 않았습니다. 이상한 점은이 컨트롤이 제대로 작동하고 중지되었다는 것입니다. 그리고 그 사이에 어떤 코드도 변경하지 않았다고 생각합니다. 미친.
drekka 2015 년

위와 같이 경고를 표시했습니다. 이제 디자인 가능한 원본 IB에서 복사 한 코드로 두 번째 클래스를 만들었습니다. 이 수업은 완벽하게 작동하며 원래의 비근로 수업으로 다시 전환했을 때 이제 정상적으로 작동합니다. 이것으로부터 나는 원래 ib 디자인 가능이 다른 ib 디자인 가능으로 교체 될 때까지 지워지지 않는 어딘가에 (파생 데이터가 아닌) 캐시가 있다는 결론을 내 렸습니다. UIView로 변경해도이 캐시가 지워지지 않는 것 같습니다. 설계 가능한 또 다른 ib. 그림 이동 :-)
drekka

답변:


75

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

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

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

여기에 이미지 설명 입력

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

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

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

이번에는 새로운 것 :

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

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

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

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

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

여기에 이미지 설명 입력

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


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

여기에 이미지 설명 입력


2
나는 실제로 백그라운드에서 렌더링을 유지하여 구형 MacBook을 정말 느리게 만들기 때문에 끄는 방법을 찾고있었습니다. 감사!
Departamento B

이 임시 해결하지만, 마틴 질 라보 @로부터 답변을 확인 할 수 있습니다
애슐리 밀스

22

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

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

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

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

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

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

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


그렇다면 IB가 이러한 클래스와 관련이 없거나 링크되지 않은 뷰를로드하고 표시하지 못하도록하려면 어떻게해야합니까?
HannahCarney 2015-10-13

나는 그것이 헤더 의존성과 관련이 있다고 가정하고 있습니다. 디자인 가능한 클래스가 다른 클래스에 닿으면 헤더가 보이는 순간 관련 구현을 빌드합니다. Apple은 XC7GM의 소스 종속성 그래프 코드를 가지고 놀았습니다. 그래프를 작성할 때 XCode가 충돌하여 프로젝트에서 완전히 실패합니다. 다음 7.1 베타는 문제를 나타내지 않습니다. 우리의 자동화 된 빌드 시스템은 아직 6.4에 종속되어 있으므로 XC6.4에서이 문제를 더 이상 해결하는 방법을 조사하지 않았습니다. 7.1GM으로 곧장 이동할 것입니다.
Martin-Gilles Lavoie 2015 년

여러 대상 / 프로젝트가있는 경우 이것이 절대적으로 정답이며 실제로 문제를 해결합니다. 모든 대상은 깨끗하게 빌드해야합니다. 보고서 탐색기에 "인터페이스 빌더"섹션이 있는지조차 몰랐습니다! 내가 본 다른 모든 답변은 기본적으로 일시적으로 수정할 수있는 많은 손 흔들림이지만 이것이 확실한 해결책입니다. 잘 했어.
Ashley Mills

3
따라서 이것에 따르면 IB_DESIGNABLE 속성이 총체적이며 시간 낭비라는 결론을 내릴 수 있습니다. 그것을 사용하지 마십시오.
m8labs

IB_DESIGNABLE은 위에 나열된 문제 및 솔루션과 관련이 없습니다. IB가 사용 가능한 것을 발견하는 것은 단순히 NO-OP 플래그입니다. 깨끗한 집을 유지하기 만하면됩니다.
Martin-Gilles Lavoie

22

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

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

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

6

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

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

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

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


1
동일한 결과를 달성하기위한 엑스 코드에서 바로 가기 : ⌘⇧K
Mojo66

@ Mojo66 Clean Build는 DerivedData 폴더를 제거하는 것과 다릅니다. 물론 때때로 클린 빌드는 특정 Xcode 캐싱 문제를 해결하기에 충분 합니다.
samwize

@ Mojo66 당신은 아마 ⌘⌥⇧K (cmd + alt + shift + K)를 의미했을 것입니다
tzaloga

5

다른 사람이 내가 한 것과 같은 이유로 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">

1
이런 젠장,이게 하루 동안 나를 미치게 만들었다. 정말 끔찍한 작은 버그입니다.
GoldenJoe

5

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

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

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

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

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


4

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


나는 당신이 말한 것을 정확하게했고 그것은 내 문제를 해결했습니다. 여기에 공개 된 모든 이전 솔루션이 성공하지 못했습니다. 감사합니다. ; o)
XLE_22

@ XLE_22 때로는 아무도 보지 않는 답이 그것을 해결합니다. :)
HannahCarney

내 xib 중 일부에서 IBInspectable 속성의 이름을 바꾸는 문제가 발생했습니다. 그 후 XCode가 현재 이름이 바뀐 속성을 찾을 수 없다는 것을 알려주는 많은 경고를 받았습니다. 신원 검사관에서 속성을 제거하면 문제가 해결되었습니다.
WBuck

1

나는 이것이 대답된다는 것을 알고 있지만 여기에 또 하나의 경험이 있습니다.

이 문제와 관련이없는 문제가 있었지만 그 과정에서 클래스의 vars에서 @IBInspectable을 제거하고 ID 검사기 (alt-apple-3)에서 속성을 삭제했습니다.

구성 요소의 (코드) 문제를 수정 한 후 모든 것을 여러 번 새로 고쳤지만 여전히 ID 검사기에 속성이 없습니다.

결국, 나는 그들이 돌아 왔지만 속성 검사기 (alt-apple-4)에서만 발견되었습니다 . 거기에 값을 추가하자마자 ID 검사기에 다시 나타납니다.


1

의 Dave Thomas의 답변 은 다른 사람 (파생 데이터, 편집기> 새로 고침)이 아닌 경우 (역방향) 솔루션을 제공했지만 사람들이 XML을 어디에서 편집 해야하는지 확실하지 않은 경우 명확성을 위해 ... 필요합니다!

  1. 스토리 보드 파일에서 번거로운보기를 선택하십시오.
  2. 오른쪽 사이드 바에서 Identity Inspector 탭 (왼쪽에서 세 번째 옵션)을 선택합니다.
  3. 이미 설정되어 있어야하는 사용자 정의 클래스와 Module. 나를 위해 이것은 비어 있었고 OP와 동일한 오류가 발생했습니다. Module프로젝트 이름 과 BAM으로 설정 했습니다. 재 구축 후 작동하기 시작했습니다!

0

이 문제에 대해 방금 전화를 걸었습니다. 나는 여기와 다른 곳에서 나열된 모든 것을 운없이 시도했습니다. 이것은 영원히 잘 작동 한 스토리 보드이며 갑자기 "사용자 정의 런타임 속성을 무시하는 중 ..."문제와 함께 작동을 멈췄습니다.

어떤 이유로 든 내 IBDesignable 중 하나에서이 코드를 제거하면 문제가 해결되었습니다.

-(void)viewDidLoad {
    self.clipsToBounds = YES;
}

이를 제거하면 다른 IBDesignable 개체에서도 모든 경고가 사라졌습니다. 이 단계가 왜 문제를 해결했는지 모르겠지만 다른 사람에게도 도움이 될 것입니다.


3
여기 저녁에 전화 누락
RolandasR

0

나는 같은 문제를 겪고 있었고 cornerRadius와 BorderWidth를 String으로 변경 한 다음 CGFloat로 캐스트해야했는데, 값을 변경하고 인터페이스 빌더의 변경 사항을 볼 수있는 유일한 솔루션이었습니다.

@IBInspectable var borderColor: UIColor? {
    didSet {
        layer.borderColor = borderColor!.CGColor
    }
}

@IBInspectable var borderWidth: String? {
    didSet {
        layer.borderWidth = CGFloat(Int(borderWidth!) ?? 0)
    }
}

@IBInspectable var cornerRadius: String? {
    didSet {
        layer.cornerRadius = CGFloat(Int(cornerRadius!) ?? 0)
        layer.masksToBounds = layer.cornerRadius > 0
    }
}

나는 어쩌면 당신이 사용하는 데 필요한 것, IBInspectable는 특정 유형을 할 수 있다고 생각 Float하는 대신 CGFloat캐스팅 대신 있음
Fonix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.