ฉันจะตรวจสอบลำดับชั้นการดูใน iOS ได้อย่างไร


170

มีเครื่องมือ GUI ที่ตรวจสอบลำดับชั้นการดูของแอพ iOS หรือไม่? ฉันกำลังคิดเกี่ยวกับตัวตรวจสอบเว็บของ Webkit หรือเครื่องมือที่คล้ายกัน ฉันต้องการตรวจแก้จุดบกพร่องปัญหาเลย์เอาต์เช่นมุมมองที่มีตำแหน่งหรือขนาดไม่ถูกต้องหรือมีเด็กอยู่ในพาเรนต์ไม่ถูกต้อง ขณะนี้ฉันต้องเพิ่ม asserts ที่ทดสอบเงื่อนไขต่าง ๆ เหล่านี้ด้วยตนเองหรือตั้งค่าสีพื้นหลังที่แตกต่างกันในมุมมองที่แตกต่างกันและอย่างที่คุณสามารถจินตนาการได้นั่นเป็นวิธีที่น่าเบื่อหน่าย

ฉันดูเครื่องมือUI recorderแต่ก็บันทึกและเล่นการกระทำ UI เท่านั้นและในกรณีใด ๆ ก็ใช้ได้กับแอป Mac เท่านั้น

มีวิธีแก้ปัญหาที่ดีกว่านี้ไหม?

คำตอบ:


168

Xcode 6 ตอนนี้มีการตรวจสอบลำดับชั้นของมุมมอง 3 มิติที่มีในตัวเช่น Reveal App และ Spark Inspector

ป้อนคำอธิบายรูปภาพที่นี่

คลิกที่ปุ่ม "ลำดับชั้นการดู Debug" ในขณะที่แอปของคุณกำลังทำงานเพื่อหยุดการประมวลผลและตรวจสอบมุมมองในขณะนี้

ป้อนคำอธิบายรูปภาพที่นี่

ข้อมูลเพิ่มเติมได้ที่เอกสารแอปเปิ้ล


5
ถ้าตัวเลือกมุมมองการแก้จุดบกพร่องไม่สามารถใช้ดูstackoverflow.com/questions/24040322/...
kennytm

ตอนแรกฉันไม่เห็นแถบเครื่องมือที่แสดงโดย Levi McCallum เพราะอยู่ที่ด้านล่างสุดของหน้าต่าง Xcode หากแอพไม่มีการแก้ปัญหาเอาต์พุต และเมื่อกดปุ่มแล้วหน้าต่างมุมมองลำดับชั้นจะว่างเปล่าจนกว่าฉันจะกดปุ่มใดปุ่มหนึ่งที่ด้านล่างหรือปรับหนึ่งในตัวเลื่อน
Carl Smith

เมื่อคุณเริ่มใช้เครื่องมือนี้มันจะหลุดพ้น ฉันไม่ทราบสาเหตุหรือวิธีการแก้ไข แต่ดูเหมือนว่าจะเกิดขึ้นในมุมมองที่ซับซ้อนมากขึ้น
Departamento B

263

ฉันไม่รู้ว่ามีเครื่องมือตรวจสอบมุมมอง GUI แต่ฉันโชคดีกับวิธีการแก้ไขข้อบกพร่องใน UIView: -recursiveDescription

ถ้าคุณหยุดโปรแกรมในดีบักเกอร์ชั่วคราวและใส่สิ่งนี้ลงใน GDB (แก้ไข: ยังใช้งานได้ใน LLDB)

po [[UIWindow keyWindow] recursiveDescription]

คุณได้รับลำดับชั้นการพิมพ์ทั้งหมดของคุณ คุณยังสามารถเรียกมันบนมุมมองเฉพาะเพื่อรับลำดับชั้นมุมมองของมุมมองนั้น

มันอาจจะน่าเบื่อนิดหน่อยที่จะลุยผ่านข้อมูลที่คุณได้รับจากมัน แต่มันได้พิสูจน์แล้วว่าเป็นประโยชน์กับฉัน

เครดิตไปที่โพสต์บล็อกนี้ซึ่งพูดคุยเกี่ยวกับวิธีการนี้และเชื่อมโยงไปยังนี้เป็นประโยชน์ แต่ค่อนข้างยากที่จะหาโน้ตเทคโนโลยีแอปเปิ้ล


1
ฉันได้รับ: ข้อผิดพลาด: ไม่พบการประกาศอินเทอร์เฟซสำหรับ '$ __ lldb_objc_class' มีความคิดเห็นใด ๆ (lldb) PO [[UIWindow keyWindow] recursiveDescription] ข้อผิดพลาด: ไม่สามารถหาประกาศอินเตอร์เฟซสำหรับข้อผิดพลาด '$ __ lldb_objc_class': ไม่สามารถหาประกาศอินเตอร์เฟซสำหรับข้อผิดพลาด '$ __ lldb_objc_class': 2 ข้อผิดพลาดในการแยกวิเคราะห์การแสดงออก
Zennichimaro

1
ฉันเชื่อว่าคำตอบนี้ไม่ใช่คำตอบที่ยอมรับอีกต่อไปเนื่องจากมีเครื่องมือ GUI ที่พร้อมตอบคำถามโดยตรงว่า 'มีเครื่องมือ GUI ... หรือไม่'
theraven

เริ่มต้นด้วย xcode 5.1 ฉันเริ่มได้รับข้อผิดพลาดนี้ทุกครั้งที่ฉันพิมพ์ข้อผิดพลาด recursiveDescription: ตัวอย่างวิธี 'undoManager' มีประเภทผลลัพธ์ที่เข้ากันไม่ได้ในหน่วยการแปลที่แตกต่างกัน ('id' กับ 'NSUndoManager *') หมายเหตุ: : 1 ข้อผิดพลาดในการแยกวิเคราะห์นิพจน์
abbood

1
ในขณะที่คำถามนั้นเก่าและถามเกี่ยวกับวิธีการแบบกราฟิกคำตอบเฉพาะนี้เกี่ยวข้องกับวิธีแก้ไขปัญหาแบบข้อความ การอภิปรายของการแก้ปัญหาที่ยอมรับในรหัสสามารถพบได้เช่นที่นี่: stackoverflow.com/a/14193682/2431627 เช่นการใช้คุณสมบัติ _printHierarchy ผ่าน KVC
Robin Macharg

46

เปิดเผยภาพหน้าจอแอป

ผิดปกติพอตอนนี้มีอีกตัวเลือกหนึ่งคือhttp://revealapp.com/ซึ่งตอนนี้โพสต์นั้นเป็นเบต้าแบบเปิด (ฟรี) อย่างที่คุณเห็นมันเป็นเครื่องตรวจสอบด้วยภาพอีกอันหนึ่ง

แก้ไข 2014-04-05: การเปิดเผยเป็นรุ่นเบต้าและไม่ฟรีอีกต่อไป อย่างไรก็ตามมีการทดลองใช้ 30 วัน


1
ฉันได้ลองใช้เครื่องมือสองสามอย่างสำหรับเรื่องนี้ (Spark Inspector, iOS Hierarchy Viewer และมุมมองที่เหมือน firebug ในเครื่องมือทดสอบของ Frank) จนถึงตอนนี้การเปิดเผยเป็นสิ่งที่ฉันชอบ
Stew

1
แต่ทั้งหมดก็ยังคงคุ้มค่า เป็นวิธีที่ดีกว่าเครื่องมือ Xcode ในตัวสำหรับการดูมุมมอง
Will Larche

35

คำถามนี้เก่า แต่ให้ฉันใส่ข้อมูลที่นี่เกี่ยวกับเครื่องมือใหม่ที่ฉันพัฒนา: https://github.com/glock45/iOS-Hierarchy-Viewer ป้อนคำอธิบายรูปภาพที่นี่


เป็นไปได้ไหมที่จะรีเฟรชหน้าเว็บโดยอัตโนมัติเมื่อฉันไปที่มุมมองอื่นในเครื่องจำลอง นอกจากนี้เป็นไปได้ไหมที่จะเปลี่ยนค่าในวิวเวอร์นี้ (ดังนั้นฉันสามารถทำการทดสอบบางอย่างบนเบราว์เซอร์โดยไม่ต้องเขียนโค้ดจริง)? ขอบคุณ :)
Brian

1
@Brian ขอบคุณ Brain ฉันเริ่มต้นแบบความเป็นไปได้ที่จะเปลี่ยนค่า มันถูกปิดในการเปิดตัวอย่างเป็นทางการ คอยติดตาม !
Damian Kołakowski

ขอบคุณมากสำหรับคำแนะนำ ฉันจัดการเพื่อแก้ไขปัญหาของฉันด้วยเครื่องมือนี้ปัญหาที่ไม่สามารถแก้ไขได้โดยใช้ดีบักเกอร์ UI ของ Xcode!
D6mi

ขอขอบคุณดาเมียน แต่สำหรับคนที่อ่านข้อความนี้เครื่องมือนี้ดูเหมือนจะหมดสติไปแล้ว
Vaddadi Kartick

17

ป้อนคำอธิบายรูปภาพที่นี่

เพียงเพื่อให้หัวข้อนี้ถึงวันที่ฉันได้รับเมื่อเร็ว ๆ นี้เล่นกับSpark สารวัตร มันไม่ฟรี แต่มันเยี่ยมมาก



6

ฟรี: เพียงพิมพ์สิ่งนี้ในตัวตรวจสอบ:

po [[UIWindow keyWindow] recursiveDescription]

พาณิชย์: http://revealapp.com/ฉันทดสอบรุ่นเบต้าของ apps เปิดเผยมันก็ดีแม้ว่าจะมีข้อบกพร่อง เครื่องมือเชิงพาณิชย์อื่น: http://sparkinspector.com/มันทำงานได้อย่างราบรื่น


Spark สารวัตรมีการแจ้งเตือนที่ดีของผู้ชม
thierryb

6

สวิฟต์ 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"))))
   }
}

การใช้งาน (ในดีบักเกอร์): po myView.dump()


2

นี่จะเป็นการทิ้งในหน้าต่างแก้ไขข้อบกพร่อง (อ่านยาก) :( ทำงานบน iOS 10, Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()

0

คำตอบที่ได้รับอนุมัติแล้วไม่สามารถใช้งานได้อีกต่อไปโดยใช้Xcode 8และ Swift 2.3 นี่คือสิ่งที่ทำงานสำหรับฉัน:

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


1
ขอบคุณ mph แต่ไม่สามารถใช้งานได้ใน Swift 3: ข้อผิดพลาด: ไม่พบคุณสมบัติ 'shared' บนออบเจ็กต์ประเภท 'UIApplication'
Vaddadi Kartick

Swift 4 และ Xcode 9.1 บ่นด้วย "ข้อผิดพลาด: <EXPR>: 3: 32: ข้อผิดพลาด: ไม่สามารถเรียกค่าประเภทที่ไม่ใช่ฟังก์ชั่น 'UIApplication' UIApplication.sharedApplication (). keyWindow? .recursiveDescription ()"
Jason Harrison

0

สำหรับ swift / Xcode 10 ให้ป้อนสิ่งนี้ในคอนโซลการดีบัก:

po yourView.value(forKey: "recursiveDescription")!

มันจะพิมพ์ออกมาเป็นลำดับชั้น recursive UIViewสำหรับการใดก็ตาม

(เครดิต: วิธีดีบักลำดับชั้นมุมมองของคุณโดยใช้ recursiveDescription )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.