2014-11-28 23 views
8

Próbuję użyć IB Designable i IB Inspectable w moim UIButton ale wydaje się, że są pewne błędy.Biblioteka statyczna, pakunek i IB Designable

W numerze Navigator, plik bundle:

Storyboard: IB Designables: Nie można zaktualizować stan układu Auto: Nie udało się załadować designabled od ścieżki (null)

Tak Zastanawiam się, czy istnieją jakieś konfiguracje do zrobienia, aby użyć go w statycznej lib lub coś podobnego?

To

#import <UIKit/UIKit.h> 

IB_DESIGNABLE 

@interface CustomUIButton : UIButton 

@property (nonatomic) IBInspectable int cornerRadius; 

@end 

Mam zwyczaj przycisk Chcę żyć renderowanie jest wewnątrz kontrolera widoku

Odpowiedz

-2

EDIT: IB do zaprojektowania i IB podlegającej inspekcji nie wydają się działać z bibliotek statycznych, więc jeśli” ponownie użyć biblioteki statycznej, rozważ użycie dynamicznego frameworka (tylko iOS 8) lub przenieś swój komponent poza bibliotekę statyczną, jeśli to możliwe.

W przypadku problemów związanych z Cocoapods, należy użyć następującego rozwiązania:

Wiąże się to this question.

Tutaj rozwiązanie:

1) Instalacja Cocoapods (0.36.0.beta.1) lub nowszy;

2) Dodaj use_frameworks! do Podfile

Zobacz więcej here.

+4

Nie sprecyzował, że używa CocoaPods. Problem ten wydaje się mieć wpływ na IB_DESIGNABLES, które znajdują się w bibliotece statycznej i są używane w scenorysach lub ksywkach z innego projektu. The use_frameworks! dyrektywa wydaje się mówić CocoaPods do importowania frameworków zamiast statycznych bibliotek. –

3

Niestety nie jest możliwe używanie IBDesignables z bibliotekami statycznymi (lub statycznymi frameworkami).

To nie jest dobra odpowiedź, ale chcę podać kontekst, dlaczego.

Wydaje się, że sposób, w jaki Interfejs Builder ładuje zajęcia mają być wyświetlane jako designables jest rzeczywiście dynamicznie ładowania dynamiczny ramy, które tworzysz (a nie z aplikacji binarne), a przy użyciu klas bezpośrednio (po zmianie ich wykorzystaniem Objective-C runtime całkiem sporo).

Widać, że interfejs Builder nie ładuje swoją aplikację, a tylko poszczególne ramy z tych etapów:

  1. Utwórz nowy projekt Xcode
  2. Utwórz nowy cel ramową w projekcie
  3. Dodaj klasę, która jest IBDesignable
  4. W serii ujęć z aplikacji utworzyć widok i ustawić jego klasę do swojego frameworka IBDesignable klasy
  5. Kliknij "Odśwież wszystkie widoki" w menu "Edytor".
  6. W folderze DerivedData dla projektu w katalogu IBDesignables widać, że został zbudowany tylko obiekt docelowy.

Kreator interfejsów faktycznie ładuje ramkę ręcznie za pomocą dlopen. Możesz również zobaczyć, że aby to ułatwić, budując framework, program budujący interfejs faktycznie dodaje do Twojego binarnego 2 RPATH s, więc zależności można znaleźć w niestandardowych ścieżkach (możesz to zobaczyć przy pomocy otool -L frameworkbinary). Ta metoda ładowania pliku binarnego nie jest możliwa w przypadku bibliotek statycznych.

Na co warto myślę, że najlepiej obejście tego jest budowanie struktur dynamicznych, zamiast bibliotek statycznych, ale tylko dla IBDesignable buduje. Będziesz musiał wykonać pewne czynności konfiguracyjne, aby to zrobić, i nie jest łatwo obejść Xcode, aby to wykonać, ale jeśli spróbujesz, możesz użyć ścieżki budowania lub środowiska, aby rozróżnić kompilacje IBDesignable vs "normalne" kompilacje.

+0

W jaki sposób stworzysz oddzielne konfiguracje dla "normalnych" i "' 'IBDesignable''' buildów? Chciałbym użyć elementów "' '' IBDesignable'''', ale nie mogę przejść do bibliotek dynamicznych. – Coli88

+0

Możesz to zrobić, zastępując nieudokumentowane ustawienie kompilacji 'LD', które zastępuje domyślny plik wykonywalny ld i zmienia ustawienia w oparciu o katalog kompilacji, który zawiera elementy IBDesginables tylko dla tych kompilacji. Zobacz https://github.com/keith/swift-staticlibs na przykład użycia tego ustawienia kompilacji i parsowania argumentów przekazanych do ld. –