Jak mogę sprawdzić hierarchię widoków w iOS?

170

Czy istnieje narzędzie GUI, które sprawdza hierarchię widoków aplikacji na iOS? Myślę o inspektorze sieci Webkit lub podobnych narzędziach. Chcę debugować problemy z układem, takie jak widoki mające niewłaściwą pozycję lub rozmiar lub dziecko nie jest poprawnie zawarte w swoim nadrzędnym. Obecnie muszę dodać potwierdzenia, które testują te różne warunki ręcznie lub ustawiają różne kolory tła w różnych widokach, i jak możesz sobie wyobrazić, jest to naprawdę żmudny sposób.

Spojrzałem na Instruments UI recorder, ale to tylko nagrywa i odtwarza działania interfejsu użytkownika, aw każdym razie działa tylko dla aplikacji Mac.

Czy jest lepsze rozwiązanie?

Vaddadi Kartick
źródło

Odpowiedzi:

168

Xcode 6 ma teraz wbudowaną inspekcję hierarchii widoku 3D, taką jak Reveal App i Spark Inspector.

wprowadź opis obrazu tutaj

Kliknij przycisk „Debuguj hierarchię widoków”, gdy aplikacja jest uruchomiona, aby wstrzymać wykonywanie i sprawdzić bieżące widoki.

wprowadź opis obrazu tutaj

Więcej informacji w dokumentacji Apple .

Levi McCallum
źródło
5
Jeśli opcja debugowania widoku nie jest dostępna, zobacz stackoverflow.com/questions/24040322/… .
kennytm
Na początku nie widziałem paska narzędzi wyświetlanego przez Levi McCallum, ponieważ znajduje się on na samym dole okna Xcode, jeśli aplikacja nie ma żadnych danych debugowania. Po naciśnięciu przycisku okno View Hierarchy było puste, dopóki nie nacisnąłem jednego z przycisków na dole lub nie dostosowałem jednego z suwaków.
Carl Smith
Kiedy zaczniesz polegać na tym narzędziu, zawsze się psuje. Nie wiem, dlaczego i jak to naprawić, ale wydaje się, że dzieje się to na bardziej skomplikowanych widokach.
Departamento B
263

Nie wiem, czy istnieje narzędzie do inspekcji widoku GUI, ale miałem trochę szczęścia z metodą debugowania w UIView: -recursiveDescription

jeśli zatrzymasz program w debugerze i wprowadzisz to do GDB (Edycja: działa również w LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Otrzymasz wydruk całej hierarchii widoków. Możesz również wywołać go w określonym widoku, aby uzyskać wydruk hierarchii widoków tego widoku.

Przeszukiwanie informacji, które z niej uzyskasz, może być trochę nudne, ale okazało się przydatne.

Podziękowania należą się do tego posta na blogu, który mówił o tej metodzie, a także łączył się z tą pomocną, ale raczej trudną do znalezienia notatką techniczną Apple .

Simon Goldeen
źródło
1
Mam: błąd: nie mogę znaleźć deklaracji interfejsu dla „$ __ lldb_objc_class” żadnych pomysłów? (lldb) po [[UIWindow keyWindow] recursiveDescription] błąd: nie można znaleźć deklaracji interfejsu dla błędu „$ __ lldb_objc_class”: nie można znaleźć deklaracji interfejsu dla błędu „$ __ lldb_objc_class”: 2 błędy analizowania wyrażenia
Zennichimaro
1
Uważam, że ta odpowiedź nie jest już kanoniczną odpowiedzią, ponieważ obecnie dostępne są narzędzia GUI, które bezpośrednio odpowiadają na pytanie „Czy istnieje narzędzie GUI…?”
theraven
zaczynając od xcode 5.1 Zacząłem otrzymywać ten błąd za każdym razem, gdy wpisuję recursive Błąd opisu: metoda instancji „undoManager” ma niekompatybilne typy wyników w różnych jednostkach tłumaczeniowych („id” i „NSUndoManager *”) uwaga: metoda instancji „undoManager” również tutaj zadeklarowała błąd : 1 błędy podczas analizowania wyrażenia
abbood
1
Chociaż pytanie jest stare i dotyczy metod graficznych, ta konkretna odpowiedź dotyczy rozwiązań tekstowych. Omówienie kanonicznego rozwiązania w kodzie można znaleźć np. Tutaj: stackoverflow.com/a/14193682/2431627 . tj. przy użyciu właściwości _printHierarchy za pośrednictwem KVC.
Robin Macharg
46

Pokaż zrzut ekranu aplikacji

Co dziwne, teraz jest inna opcja, http://revealapp.com/ , która od tego postu jest w otwartej (bezpłatnej) wersji beta. Jak widać to kolejny inspektor wizualny.

EDYCJA 05.04.2014: Ujawnienie jest poza wersją beta i nie jest już darmowe. Istnieje jednak 30-dniowa wersja próbna.

livingtech
źródło
1
Wypróbowałem kilka narzędzi do tego (Spark Inspector, iOS Hierarchy Viewer i widok przypominający firebug w narzędziu testującym Frank). Jak dotąd Reveal jest moim ulubionym.
Gulasz
1
Ale CAŁKOWICIE nadal warto. O wiele lepsze niż wbudowane narzędzia Xcode do przeglądania widoków
Will Larche
35

To pytanie jest stare, ale pozwolę sobie na umieszczenie tutaj informacji o nowym narzędziu, które rozwijam: https://github.com/glock45/iOS-Hierarchy-Viewer wprowadź opis obrazu tutaj

Damian Kołakowski
źródło
czy możliwe jest automatyczne odświeżanie strony po przejściu do innego widoku w symulatorze? ponadto, czy można zmienić wartości w tej przeglądarce (więc mogę zrobić kilka testów w przeglądarce bez pisania prawdziwego kodu)? dzięki :)
Brian
1
@Brian dzięki Brain. Zacząłem prototypować możliwość zmiany wartości. Jest wyłączony w oficjalnym wydaniu. Bądźcie czujni !
Damian Kołakowski
Wielkie dzięki za sugestię. Udało mi się rozwiązać mój problem za pomocą tego narzędzia, problem, którego nie można rozwiązać za pomocą debuggera interfejsu użytkownika Xcode!
D6mi,
Dzięki, Damian, ale dla ludzi, którzy to czytają, to narzędzie wydaje się być nieobsługiwane.
Vaddadi Kartick
17

wprowadź opis obrazu tutaj

Aby aktualizować ten wątek, ostatnio bawiłem się z Spark Inspector . To nie jest darmowe, ale jest bardzo przyjemne.

livingtech
źródło
6

Bezpłatnie: po prostu wpisz to w inspektorze:

po [[UIWindow keyWindow] recursiveDescription]

Komercyjne: http://revealapp.com/ Testowałem wersję beta remove, była dobra, chociaż ma błędy. Kolejne narzędzie komercyjne: http://sparkinspector.com/ działa bezproblemowo.

AVEbrahimi
źródło
Spark Inspector ma fajną przeglądarkę powiadomień
thierryb
6

Szybki 4.

iOS :

extension UIView {

   // Prints results of internal Apple API method `recursiveDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("recursiveDescription"))))
   }
}

macOS :

extension NSView {

   // Prints results of internal Apple API method `_subtreeDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("_subtreeDescription"))))
   }
}

Użycie (w debugerze): po myView.dump()

Vlad
źródło
2

To zrzuca wszystko w oknie debugowania. (Trudne do odczytania) :( Praca na iOS 10, Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()
Alix
źródło
0

Zatwierdzona odpowiedź już nie działa dla mnie, używając Xcode 8 i Swift 2.3. Oto, co działa dla mnie:

po UIApplication.sharedApplication().keyWindow?.recursiveDescription()

mph
źródło
1
Dzięki, mph, ale to również nie działa w Swift 3: błąd: właściwość „udostępniona” nie została znaleziona w obiekcie typu „UIApplication”
Vaddadi Kartick
Swift 4 i Xcode 9.1 narzekają „błąd: <EXPR>: 3: 32: błąd: nie można wywołać wartości typu niefunkcyjnego„ UIApplication ”UIApplication.sharedApplication (). KeyWindow? .RecursiveDescription ()”
Jason Harrison