Mam następujący zestaw kodów:
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
(Dla odniesienia w języku Swift ten problem występował również w kodzie 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
}
}
}
Dodałem UIView
do kontrolera widoku w scenorysie i ustawiłem jego podklasę na CustomView
.
Spowoduje to dodanie wiersza „Designables”. Utknął na „Aktualizacji”, a podpowiedź mówi „Oczekiwanie na zbudowanie celu”. Ten status nigdy się nie zmienia.
Kiedy przejdę do inspekcji atrybutów, mogę ustawić następujące IBInspectable
właściwości:
Po ustawieniu pojawiają się również w „Atrybutach środowiska wykonawczego zdefiniowanych przez użytkownika”:
Jednak status „Designables” nigdy nie wykracza poza „Updating” z wciąż tą samą wskazówką (próbowałem budować Cmd + B kilka razy, nic się nie zmienia).
Ponadto podczas ustawiania IBInspectable
właściwości otrzymuję ostrzeżenie o każdej z nich:
IBDesignables - Ignorowanie atrybutu środowiska wykonawczego zdefiniowanego przez użytkownika dla ścieżki klucza „borderColor” w wystąpieniu „UIView” ... ta klasa nie jest zgodna z kodowaniem klucz-wartość dla klucza borderColor.
Zrzut ekranu z wygenerowanymi ostrzeżeniami:
Znam problemy związane z kodowaniem klucz-wartość i ogólnie wiem, jak je rozwiązać ... ale nie rozumiem, jak rozwiązać ten problem tutaj. Według inspektora tożsamości widoku jest to „Widok niestandardowy” (a nie zwykły „UIView”, który nie ma tych właściwości). A gdyby widok nie był „Widokiem niestandardowym”, te dające się zaprojektować właściwości nie pojawiałyby się w Inspektorze atrybutów, prawda? Ale kiedy Interface Builder próbuje zastosować te atrybuty do widoku, wraca do myślenia, że klasą widoku jest „UIView” i nie może zastosować atrybutów.
Jakaś pomoc? Daj mi znać, jeśli pominąłem kilka ważnych szczegółów, ale ze względu na to, co jest warte, dokładnie postępowałem zgodnie z tym samouczkiem (poza ObjC vs Swift). Warto również zauważyć, że śledziłem ten samouczek dokładnie na innej maszynie i działał jak urok (zamierzałem napisać ten post wczoraj wieczorem, ale komputer, na którym byłem wtedy, nie miał tego problemu).
Na podstawie komentarzy zasugerowano, że być może .m
plik nie jest dołączony i to może być przyczyną problemu. Myślałem, że na pewno zrobię wszystko, co w mojej mocy, aby ten scenariusz miał miejsce, ale i tak sprawdziłem.
Kiedy po raz pierwszy zacząłem to robić, zdawałem sobie sprawę, że te IB_DESIGNABLE
zajęcia muszą być częścią innej UIKit
struktury. Na tym pierwszym zrzucie ekranu widać, że skonfigurowałem strukturę „CustomViews”, która ma jedną klasę CustomView
. Zobaczysz tutaj również, że utworzyłem również plik OtherView
, który jest identyczny z tym CustomView
, że nie znajduje się w oddzielnym frameworku. Jednak identyczny problem występuje w scenorysie między obiema klasami.
Tutaj mamy zrzut ekranu wskazujący, że CustomView.m
jest dołączony do zbudowania z CustomViews
frameworkiem:
Tymczasem poniższy zrzut ekranu wskazuje na kilka rzeczy:
CustomViews.framework
jest odpowiednio uwzględniony w głównym projekcie.OtherView.m
jest również dołączany jako źródło kompilacji, więc nawet jeśli coś jest nie takCustomView
,OtherView
powinno działać, jednak generuje identyczne błędy.Main.storyboard
iLaunchScreen.xib
są wyświetlane jako czerwone. Nie mam pojęcia dlaczego i nie mam najmniejszego pojęcia, dlaczegoLaunchScreen.xib
powinienem (nie dotykałem tego pliku), chociaż mogę powiedzieć, że po obejrzeniu innych projektów,Main.storyboard
również pojawia się na czerwono dla tych projektów, a ja nic nie robić zIB_DESIGNABLE
lubIBInspectable
tam.
Próbowałem i próbowałem to teraz kilka razy. Działa za każdym razem na moim komputerze w domu - nie mogę odtworzyć problemu opisanego w tym pytaniu w domu. W pracy to nigdy nie działa. Problem opisany w tym pytaniu zdarza się za każdym razem.
Oba komputery to Mac Minis zakupione nowe w tym roku (nie nowe modele, model z końca 2012 roku). Oba komputery działają pod kontrolą systemu OS X Yosemite 10.10. Na obu komputerach działa Xcode w wersji 6.1. W domu kompilacja to (6A1052d). Dziś rano mogę potwierdzić, że na obu komputerach działają identyczne kompilacje Xcode.
Inni zasugerowali mi, że może to być zła pamięć RAM. Wydaje mi się to naciągane. Wielokrotnie restartowałem projekt, wielokrotnie restartowałem komputer. Wydaje mi się, że gdyby na komputerze mającym około 6 miesięcy była zła pamięć RAM, zobaczyłbym inne problemy i że ten problem byłby mniej spójny. Ale ten właśnie problem utrzymuje się pomimo wielokrotnego restartowania całego projektu od zera i pełnych restartów na komputerze.
Warto zauważyć, że jeśli faktycznie skompiluję i uruchomię ten projekt, niestandardowy widok z IBInspectable
właściwościami faktycznie wyświetla się tak, jak oczekuję, że wyświetli go scenorys. Wyobrażam sobie, że tak by się stało nawet bez dyrektyw IB_DESIGNABLE
i IBInspectable
, ponieważ są one tworzone jako atrybuty środowiska wykonawczego zdefiniowane przez użytkownika.
Odpowiedzi:
Opierając się na sugestii Chrisco, aby debugować wybrany widok (co już zrobiłem, ale postanowiłem spróbować ponownie), zauważyłem kilka innych opcji na dole menu Edytor.
Kliknąłem „Odśwież wszystkie widoki” i po zastanowieniu się przez Xcode nagle scenorys wyświetlał mój widok zgodnie z oczekiwaniami (prawidłowo stosując moje
IBInspectable
właściwości).Następnie ponownie przeszedłem przez cały proces, aby potwierdzić, że jest to rozwiązanie.
I stworzył nową klasę
ThirdView
. Ta klasa jest znowu identyczna z innymi. Zmieniłem klasę widoku naThirdView
i tym razem otrzymałem coś nieco innego:Kliknięcie „Pokaż” do ostrzeżeń:
Tym razem nowy:
To naprawdę nie jest bardziej pomocne niż to, co już istniało. Dodatkowo, teraz pozostałe trzy ostrzeżenia podwoiły się do 6 dziwnie.
W każdym razie, jeśli ponownie kliknę „Odśwież wszystkie widoki” z menu rozwijanego Edytora, wszystkie błędy znikną i ponownie widok zostanie poprawnie wyświetlony.
Jednak do tego momentu wszystko, co robiłem, było rzeczami, których nigdy nie majstrowałem w domu. W domu po prostu działało. Więc włączyłem "Automatyczne odświeżanie widoków" i stworzyłem "FourthView" do przetestowania - po raz kolejny identyczny z trzema pierwszymi.
Po zmianie klasy widoku na „FourthView” etykieta designables mówiła na krótką chwilę „Aktualizowanie”, po czym w końcu powiedziała „Aktualne”:
Więc sprawdziłem komputer w domu. Na komputerze, który zawsze działał, włączono opcję „Automatyczne odświeżanie widoków”. Został wyłączony na komputerze, który nie był. Nie pamiętam, bym kiedykolwiek dotykał tej opcji menu. Nie mogę nawet powiedzieć na pewno, czy istniał przed Xcode 6. Ale ta opcja robi różnicę.
TL; DR, jeśli masz ten sam problem opisany w pytaniu, upewnij się, że opcja „Automatycznie odświeżaj widoki” jest włączona (lub ręcznie „Odśwież wszystkie widoki”, gdy potrzebujesz aktualizacji w IB):
źródło
Mam jeszcze kilka szczegółów, które mogą spowodować, że Twoje klasy IBDesignable nie zostaną załadowane.
Wybierz problematyczny scenorys / XIB, w którym powinny być wyświetlane niestandardowe widoki.
W obszarze nawigatora przejdź do Nawigatora raportów w obszarze roboczym / projekcie XCode.
W menu Edytora XCode naciśnij (jak wspomniał nhgrif) opcję „Odśwież wszystkie widoki”. To spowoduje, że IB uruchomi kompilację dla całej masy rzeczy, których, jestem pewien, nie spodziewałbyś się.
W Nawigatorze raportów kliknij „Według grupy”, aby przefiltrować zawartość i zajrzyj do sekcji „Konstruktor interfejsu”. Zobaczysz, że w celu załadowania niestandardowego frameworka widoków IBDesignable skompiluje WIELE rzeczy. Jeśli którykolwiek z tych celów NIE kompiluje się, na przykład (być może przestarzałe) cele testów jednostkowych (nawet jeśli są całkowicie niezwiązane z kodem, który ładuje te widoki lub scenorys), IB nie powiedzie się podczas ładowania biblioteki dll.
W moim przypadku IB próbował skompilować 8 celów, w tym 4, w których testy jednostkowe nie były aktualizowane od czasu ostatnich zmian refaktoryzacji, nad którymi pracowaliśmy.
Większość zmian / poprawek kodu, które zrobiłem, aby IB prawidłowo ładował i wyświetlał moje niestandardowe widoki, które nie były powiązane lub nawet połączone z tymi klasami, ani nigdy nie ładowałby storyboardu podczas wykonywania tych testów jednostkowych. Jednak IB miał zależność od kompilowania całego obszaru roboczego, aby to działało.
źródło
Szybka wskazówka dla każdego, kto ma ten problem: pamiętaj, aby określić typ zmiennej.
// Doesn't show up in IB @IBInspectable var includeLeftSection = true // Shows now that it knows the type @IBInspectable var includeLeftSection : Bool = true
źródło
Miałem to samo ostrzeżenie
Ignoring user defined runtime attribute for key path ..
Otrzymałem chociaż jestem absolutnie pewien, że nie zrobiłem nic złego w mojej niestandardowej klasie widoku IBDesignable.Okazało się, że w moim przypadku ma to związek z pamięcią podręczną Xcode.
rm -rf ~/Library/Developer/Xcode/DerivedData/*
Oczyść
DerivedData
i ostrzeżenie zniknęło.źródło
O ile ktoś inny napotka błąd, klasa IB Designables nie istnieje, z tego samego powodu co ja. Najlepsza odpowiedź nie była moim problemem ... ale tutaj jest nieco powiązany problem ...
W kodzie źródłowym tablicy scenariuszy ukryta jest właściwość o nazwie customModule.
Na przykład miałem klasę o nazwie ForwardArrow w oddzielnym frameworku, który przypadkowo dodałem do mojego głównego celu.
Więc XML dla niektórych widoków zakończył się jako customClass = "ForwardArrow" customModule = "MainTargetNameWasHere"
Kiedy usunąłem je z głównego celu w kompilacji, storyboard nie zaktualizował MainTargetNameWasHere do CustomViews, czyli frameworka, w którym się znajdował i zaczął podawać, że żadna klasa nie znalazła błędu.
Więc TLDR; Upewnij się, że jeśli Twój IBDesignable znajduje się w innym frameworku, atrybut xml customModule w Twojej planszy scenariuszy ma odpowiednią wartość. A jeśli go tam w ogóle nie ma, dodaj go.
Przykład z mojego źródła:
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">
źródło
Jako mój przykład użyłem CheckboxButton przez pod, a grafika pola wyboru nigdy nie pojawia się w scenorysie, podczas gdy mam te same problemy opisane w pytaniu tutaj:
i
Sposobem na rozwiązanie mojego problemu było podanie do modułu nazwy CheckboxButton jak poniżej:
Uwaga: należy zamienić CheckboxButton na dowolną nazwę modułu, którego używasz.
źródło
Osobiście rozwiązałem ten problem, używając przycisku „-”, aby usunąć zawartość z mojego inspektora tożsamości. Kiedy usuwasz klasy niestandardowe, zmieniasz zawartość w IB, a następnie dodajesz nową klasę niestandardową, elementy do zaprojektowania w inspektorze tożsamości nie są usuwane i spowodowało to wystąpienie tego błędu. Po prostu usuń wszystko i odbuduj.
źródło
Wiem, że na to odpowiedź, ale oto jeszcze jedno doświadczenie.
Miałem problemy niezwiązane z tym problemem, ale w trakcie tego procesu usunąłem @IBInspectable z zmiennych w mojej klasie i skasowałem atrybuty z inspektora tożsamości (alt-apple-3).
Po naprawieniu problemu (kodu) z komponentem odświeżyłem wszystko mnóstwo razy, ale nadal nie ma atrybutów w inspektorze tożsamości.
W końcu zauważyłem, że wrócili, ale tylko w inspektorze atrybutów (alt-apple-4) . Jak tylko dodałem do nich wartości, pojawili się ponownie w inspektorze tożsamości
źródło
Powyższa odpowiedź Dave'a Thomasa dała mi (odwrotne) rozwiązanie, podczas gdy inne nie (Dane pochodne, Edytor> Odśwież), ale ze względu na przejrzystość na wypadek, gdyby ludzie nie byli pewni, gdzie edytować XML ... nie trzeba!
Module
. Dla mnie to było puste i otrzymywałem te same błędy co OP. I ustawićModule
do mojego nazwa projektu i BAM - zaczęło działać po przebudowie!źródło
Właśnie przejrzałem dzwonek w sprawie tego problemu. Próbowałem wszystkich wymienionych tutaj i innych rzeczy bez powodzenia. Jest to scenorys, który działał dobrze przez zawsze i nagle przestał działać z problemem „Ignorowanie atrybutu środowiska wykonawczego zdefiniowanego przez użytkownika ...”.
Z jakiegoś powodu usunięcie tego kodu z jednego z moich IBDesignable naprawiło to:
-(void)viewDidLoad { self.clipsToBounds = YES; }
usunięcie tego spowodowało, że wszystkie ostrzeżenia zniknęły, nawet w innych obiektach IBDesignable. Nie mam pojęcia, dlaczego ten jeden krok to naprawił, ale może pomoże też komuś innemu.
źródło
Miałem ten sam problem i musiałem zmienić cornerRadius i BorderWidth na String, a następnie rzucić go na CGFloat, było to jedyne rozwiązanie dla mnie, aby móc zmienić wartości i zobaczyć zmiany w konstruktorze interfejsu.
@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 } }
źródło
Float
zamiast tegoCGFloat
i rzucić to zamiast