Xcode 8 - IB Designables - Nie udało się wyrenderować i zaktualizować stanu automatycznego układu, awaria agenta

167

Niedawno zaktualizowałem do Xcode 8 i mam problemy z Storyboard.

Jeśli otworzę projekt i nie mam otwartego Storyboardu, skompiluje się i będzie działał dobrze. Po otwarciu Storyboard otrzymuję wiele błędów dotyczących IB Designables, jak pokazano poniżej.

wprowadź opis obrazu tutaj

Te widoki są jedynymi widokami, które używają niestandardowych widoków z TextFieldEffectsi BEMCheckboxktóre zaimportowałem za pomocą Cocoapods.

Alan
źródło
Może sprawdź repozytorium poda, którego używasz, i zobacz, czy ten problem jest powszechny wśród innych użytkowników?
Zolnoor
Jakaś odpowiednia odpowiedź na to pytanie?
Mohsin Khubaib Ahmed
1
czy znaleźliście jakieś obejście?
dip
Uważaj, problem może polegać na tym, że POTRZEBUJESZ TŁUSZCZEGO KOMPUTERA dla wbudowanej biblioteki . w moim przykładzie osadziłem Swiftera. Oczywiście masz pod ręką grubą kompilację (do programowania - symulator / telefon) i wersję tylko na telefon (tylko w sklepie z aplikacjami, tylko na telefon) i po prostu przełączasz się na wersję tylko telefoniczną, gdy trzeba, aby przesłać do TestFlight itp. Nadal miał w projekcie bibliotekę telefoniczną !!!!! No! Zamiana na „prawidłowy” tłuszcz przy naprawie problemu.
Fattie

Odpowiedzi:

179

Aby znaleźć przyczynę, możesz wypróbować jedną z następujących czynności:

  1. poszukaj IBDesignablesAgentCocoaTouchdzienników w tym katalogu: ~/Library/Logs/DiagnosticReportsi zobacz przyczynę.

Uwaga: dla użytkowników z Cataliną: szukaj IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Idź do Edytor -> Debuguj wybrany widok, wybierając @IBDesignable UIViewswój scenorys i zobacz ślad stosu.

  2. Usuń folder danych pochodnych.

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
    
  3. Wyczyść swój projekt Shift + Command + Alt + K .

  4. Zbuduj swój projekt Command + B .

Maria
źródło
35
Korzystając z tego podejścia, byłem w stanie stwierdzić, że tak było Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Nie wiedziałem, że IBDesignablesAgentCocoaTouchproces wywołuje init(frame:)zamiast init?(coder aDecoder:).
Yevhen Dubinin
5
@YevhenDubinin Dziękuję, to mi pomogło. Wszystko było w porządku po tym, jak zaimplementowałem init(frame:)w mojej podklasie UIButton
doraemon,
2
To rozwiązało mój problem, ale musiałem opuścić xCode przed usunięciem danych pochodnych
Husam
2
najlepsza odpowiedź init (ramka :) to częsty problem
Michał Ziobro
1
Zamknij xcode i wyczyść DerivedData. To rozwiązało problem.
Mubashar
80

Rozwiązałem problem, wykonując następujące czynności:

  1. Idź do File > Workspace settings.
  2. Kliknij małą strzałkę w prawo obok „Dane pochodne”. Spowoduje to otwarcie aplikacji Finder w lokalizacji DerivedDatafolderu.
  3. Wejdź do DerivedDatafolderu i usuń folder odpowiadający Twojemu projektowi.
  4. Zamknij Xcode i otwórz go ponownie.
  5. Wyczyść swój projekt shiftcommandk.
  6. zbuduj swój projekt commandb.
  7. Otwórz scenorys.
  8. Idź do Editor > Refresh all views.

Zaktualizowano

Czasami po prostu idź bezpośrednio do Editor > Refresh all viewspracy. Jeśli Refresh all viewsjest wyłączona, zamknij Xcode i spróbuj ponownie.

mnemonic23
źródło
Dziękuję za wysłanie tego. Zrobiłem "old school" wiersz poleceń usunięcia danych pochodnych, ale problem nie ustąpił. Użycie twojej metody rozwiązało problem za mnie.
Adrian
Odśwież wszystkie widoki, aby wygrać także dla mnie. Dzięki!
Mike K.
56

Po prostu usuwam widok, który się nie powiódł i naciskam polecenie + Z, aby cofnąć usunięcie. Mi to pasuje.

Jeśli późniejsza edycja nieudanego widoku może się powtórzyć, powtórz powyższe czynności.

Ryan Yuen
źródło
6
To śmieszne, ale zadziałało.
Ansari
1
Niesamowite!! Pracował dla mnie
Nupur Sharma
1
Kto wie, że to może być odpowiedź. Udało się, nadal nie mogę uwierzyć
Asad Amodi
37

Z tym problemem spotkałem się w CocoaPod 1.5.0. Rozwiązaniem jest ponowne zainstalowanie poda (ponowna instalacja poda) po wyświetleniu tego błędu lub zamiast tego możesz użyć CocoaPod 1.4.0. Działa dobrze w 1.4.0 (przynajmniej dla mnie).

aktualizacja:

Dodaj następujący skrypt w Podfile, aby pomóc mi rozwiązać problem w wersji 1.5.0

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings.delete('CODE_SIGNING_ALLOWED')
    config.build_settings.delete('CODE_SIGNING_REQUIRED')
  end
end

odniesienie: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911

Jerome Li
źródło
100% prawda. downgrade do 1.4.0 rozwiązał problem za mnie.
ale_stro
4
Przerobione, strąki 1.5.0.
Andrey Oshev
3
to s work for me, you should add end` trwać kodu.
mahdi
1
U mnie też zadziałało. Wypróbowałem wszystkie inne sugestie bez powodzenia. Testowane na strąkach 1.3.1
Sal,
18

Dodanie następującego kodu do mojej @IBDesignableklasy załatwiło sprawę.

override init(frame: CGRect) {
    super.init(frame: frame)
}
Mohammad Zaid Pathan
źródło
To działa dla mnie. W rzeczywistości dodałem dwa zastąpienia do rozszerzenia UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Następnie odbuduj i ostrzeżenie (błąd) zniknie. Nie ma nawet potrzeby czyszczenia folderu kompilacji.
John Pang,
Dzięki! Dobra odpowiedź)
JiosDev
13

Dla każdego - takiego jak ja - który nie może znaleźć tego IBDesignablesAgentCocoaTouchpliku lub podczas próby „Debugowania wybranych widoków” w Edytorze pojawia się błąd, oto inny sposób debugowania tych błędów „Nie udało się wyrenderować”.

Otwórz aplikację „Konsola”, na pasku bocznym wybierz swój obecny komputer Mac (prawdopodobnie zostanie on domyślnie wybrany automatycznie), a następnie w pasku wyszukiwania wyszukaj „IBSceneUpdate” i naciśnij Enter.

W ten sposób za każdym razem, gdy pojawi się błąd Xcode dotyczący IBDesignableniemożności renderowania, otrzymasz również nowy wpis „IBSceneUpdate” zawierający więcej szczegółów o błędzie.

Tak przynajmniej mogłem debugować swoje IBDesignablebłędy!

Aplikacja konsoli pokazująca błędy IBSceneUpdate

Stelabouras
źródło
1
Aplikacja jest rzeczywistą konsolą, a nie terminalem, tak jak FYI.
Carl Upton
Dobry chwyt! Zmodyfikowałem moją odpowiedź.
Stelabouras
11

Jeśli używasz pliku xib dla niestandardowego widoku uiview. Spróbuj tego:

Zmień z

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

Do:

let bundle = Bundle(for: UserView.self) 
bundle.loadNibNamed("UserView", owner: self, options: nil)
Hoàng Công Tùng
źródło
8

Spróbuj wyłączyć opcję `` Użyj odmian cech '' (panel Tożsamość i typ) dla dowolnego pliku xib, który możesz mieć dla niestandardowych widoków, które są używane w Twojej scenorysie.

LatinCoder
źródło
7

mój problem został rozwiązany poprzez usunięcie folderów (związanych z tym projektem) z folderu danych pochodnych. możesz to zrobić, klikając Plik -> Ustawienia projektu -> następnie kliknij strzałkę na znak deside /Users/.../Xcode/DerivedData kliknij folder DerivedData, zobaczysz folder nazwany projektu i usuń je. zamknij xcode otwórz swój projekt, wyczyść projekt, wykonując ten krok Produkt-> wyczyść, a następnie skompiluj projekt: Produkt-> Kompilacja Rozwiązuje ten problem.

Mitu Vinci
źródło
4

Prawidłowa odpowiedź od @Maria :

sprawdź raport o awarii pod adresem ~/Library/Logs/DiagnosticReports

Alternatywny sposób :

  1. otwarty Spotlight

wprowadź opis obrazu tutaj

  1. rodzaj console.app

wprowadź opis obrazu tutaj

  1. Wybierz Crash reports

wprowadź opis obrazu tutaj

  1. sprawdź jeden IBDesignablesAgent-iOSi przejrzyj dziennik awarii
gbk
źródło
Korzystanie z konsoli pomogło mi rozwiązać problem. O wiele bardziej szczegółowe komunikaty niż w Xcode.
Andrew Moore,
3

Po prostu otwórz swój scenorys -> Edytor -> Odśwież wszystkie widoki. Ta praca dla mnie.

Anggara Siswanajaya
źródło
3

Próbowałem wyczyścić i uruchomić projekt nie rozwiąże tego problemu.

Ale Zamknij i ponownie otworzył projekt.

Lal Krishna
źródło
2

Kiedy to debugowałem, odkryłem, że istnieje kilka klas, które modyfikują interfejs użytkownika. Zwykle marquelabel, która jest podklasą UILabel lub dowolnej innej klasy, która tworzy podklasę UIView i rysuje interfejs użytkownika w czasie wykonywania i koliduje z silnikiem Autolayout. Spróbuj podać stałą szerokość lub wysokość dla tych niestandardowych widoków. Jeśli to nie rozwiąże problemu, wypróbuj następujące rozwiązania: -

Rozwiązanie 1: - Usuń komentarz #use_frameworks z pliku pod.

Rozwiązanie 2: - Spróbuj usunąć dane pochodne

  1. Zamknij okno edytora Xcode i wyjdź z symulatora ->
  2. Przejdź do Preferencje Xcode -> Lokalizacje ->
  3. Kliknij małą szarą strzałkę pokazującą wyprowadzoną ścieżkę danych ->
  4. Wybierz swój projekt ->
  5. Usuń wszystkie foldery w środku ->
  6. Zamknij Xcode i otwórz ponownie
Ashish Pisey
źródło
1
Czy mógłbyś wyjaśnić, jak to faktycznie rozwiązuje problem?
Paula Hasstenteufel
to rozwiązało problem, ale nadal nie wiem, dlaczego niekomfortowe, że use_frameworks, ponieważ to jest dla szybkiego projektu, prawda
Abhishek
Mój Podfile już używa frameworków, jakieś sugestie, które nie zostały odkomentowane?
mmr118
@ moni15 dodałem jeszcze jedno możliwe rozwiązanie. Proszę sprawdzić.
Ashish Pisey,
Odkomentowanie #use_frameworks w pliku pod i wyczyszczenie DerivedData działało dla mnie.
Jugal Desai,
2

Miałem ten sam problem i przyjechałem tutaj, aby spróbować dowiedzieć się, co się stało. Zauważyłem najwyżej ocenioną odpowiedź, a sama odpowiedź mi nie pomogła, ponieważ IBDesignable nie istniał w folderze dziennika i wypróbowałem już tam wszystkie inne opcje, jednak w komentarzach zauważyłem, że ktoś mówi o inicjalizacji ramki.

Zdecydowałem się skomentować moje rozszerzenie IBDesignable dla UIView i natychmiast rozwiązało to problem. Aby to naprawić, znajdź rozszerzenie powodujące problem i upewnij się, że skonfigurowałeś wymagane inity, tworząc klasę IBDesignable i dostarczając wymagane inicjatory w następujący sposób:

@IBDesignable class RoundedView: UIView {

override init(frame: CGRect) {
    super.init(frame: frame)
    sharedInit()
}

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

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    sharedInit()
}

func sharedInit() {
}
}

WAŻNE: pamiętaj, aby dodać nową klasę do przedmiotu, na którym używasz projektu.

Nox
źródło
1
Jak mówi dokumentacja, nie zapomnij wywołać super.prepareForInterfaceBuilder () w swojej implementacji readyForInterfaceBuilder ().
Jaime S
1

Napotkano ten sam błąd: po dostosowaniu UITextField i użyciu konstruktora interfejsu błąd w konsoli to -Użycie niezaimplementowanego inicjatora „init (ramka :)” dla klasy „CustomField”

Dodano inicjator, aby naprawić błąd

Avinash
źródło
1

Napotkałem ten problem po aktualizacji do najnowszej wersji XCode.Po wypróbowaniu wielu rozwiązań opisanych powyżej, tylko całkiem Xcode, a następnie zamknąłem system i go włączyłem i to zadziałało.

Mehsam Saeed
źródło
0

Po wprowadzeniu niezbędnych zmian zmień scenorys lub w moim przypadku plik .xib, aby otworzyć w „XCode 7”, zapisz i zamknij. Jest to tylko środek zapobiegający błędom, ale ostatecznie będziesz musiał je naprawić lub robić to, dopóki nie będziesz w stanie.

Alberto Lopez
źródło
0

W moim przypadku korzystałem z biblioteki, która była podklasą UIView. Używał IB_DESIGNABLEi brakowało połączenia [super awakeFromNib]. Po dodaniu wywołania do tej metody błąd zniknął.

Nie jestem pewien, czy IB_DESIGNABLEmiał na to wpływ fakt, że był wdrażany .

AnthoPak
źródło
Gdzie dodałeś kod dla [super awakeFromNib]? Czy możesz udostępnić swój kod?
TheJeff,
0

To dla mnie najłatwiejszy sposób: dodaj ten skrypt do swojego Podfile

Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if target.product_type == "com.apple.product-type.bundle"
    target.build_configurations.each do |config|
      config.build_settings['CONFIGURATION_BUILD_DIR'] = '$PODS_CONFIGURATION_BUILD_DIR'
    end
  end
end

Źródło:

To obejście dla @IBDesignable można znaleźć tutaj: https://github.com/CocoaPods/CocoaPods/issues/5334

NFerocious
źródło