Xcode 8 - IB Designables - การเรนเดอร์และอัพเดตสถานะเลย์เอาต์อัตโนมัติล้มเหลวเอเจนต์ขัดข้อง


167

ฉันเพิ่งอัพเกรดเป็น Xcode 8 และฉันมีปัญหากับสตอรีบอร์ด

ถ้าฉันเปิดโครงการและฉันไม่ได้เปิดกระดานเรื่องราวมันจะรวบรวมและทำงานได้ดี เมื่อฉันเปิดกระดานเรื่องราวฉันได้รับข้อผิดพลาดหลายอย่างเกี่ยวกับ IB Designables ดังที่แสดงด้านล่าง

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

มุมมองเหล่านี้เป็นมุมมองเดียวที่ใช้มุมมองที่กำหนดเองจากTextFieldEffectsและBEMCheckboxที่ฉันนำเข้าโดยใช้ Cocoapods


อาจตรวจสอบที่เก็บสำหรับ Pod ที่คุณใช้และดูว่าปัญหานี้แพร่หลายในหมู่ผู้ใช้รายอื่นหรือไม่
Zolnoor

คำตอบที่เกี่ยวข้องกับเรื่องนี้?
Mohsin Khubaib อาเหม็ด

1
พวกคุณเจอวิธีแก้ปัญหาเหรอ?
จุ่ม

ระวังปัญหาที่อาจเกิดขึ้นกับคุณคุณต้องมี FAT BUILD สำหรับไลบรารี่แบบฝัง ในตัวอย่างของฉันฉันมี Swifter ฝังตัว โดยปกติคุณจะต้องสร้าง build fat (เพื่อการพัฒนา - simulator / phone) และ build-only สำหรับโทรศัพท์ (สำหรับ app store, phone only) และคุณเพียงสลับไปที่ phone-only เมื่อจำเป็นต้องส่งไปยัง TestFlight เป็นต้นฉันยังคง มีห้องสมุดโทรศัพท์เท่านั้นในโครงการ !!!!! Doh! การสลับไปที่ไขมัน "ถูกต้อง" เมื่อแก้ไขปัญหาแล้ว
Fattie

คำตอบ:


179

คุณสามารถลองวิธีใดวิธีหนึ่งต่อไปนี้เพื่อหาสาเหตุ:

  1. ค้นหาIBDesignablesAgentCocoaTouchบันทึกในไดเรกทอรีนี้: ~/Library/Logs/DiagnosticReportsและดูสาเหตุ

หมายเหตุ: สำหรับผู้ใช้ที่มี Catalina: มองหา IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. ไปที่ Editor -> Debug มุมมองที่เลือกขณะที่เลือก@IBDesignable UIViewในกระดานเรื่องราวของคุณและดูการติดตามสแต็ก

  2. ลบโฟลเดอร์ Derive Data

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
  3. ทำความสะอาดโครงการของคุณShift + Command + +Alt K

  4. สร้างโครงการของคุณ+Command B


35
Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'ใช้วิธีนี้ก็สามารถที่จะพบว่าสาเหตุที่เป็น ผมไม่ทราบว่าIBDesignablesAgentCocoaTouchโทรกระบวนการแทนinit(frame:) init?(coder aDecoder:)
Yevhen Dubinin

5
@YevhenDubinin ขอบคุณสิ่งนี้ช่วยฉัน ทุกอย่างเรียบร้อยดีหลังจากที่ฉันใช้งานinit(frame:)ในคลาสย่อย UIButton ของฉัน
doraemon

2
สิ่งนี้แก้ไขปัญหาของฉันได้ แต่ฉันต้องออกจาก xCode ก่อนลบข้อมูลที่ได้รับมา
Husam

2
คำตอบที่ดีที่สุด init (เฟรม :) เป็นปัญหาที่พบบ่อย
Michał Ziobro

1
ออกจาก xcode และล้าง DerivedData มันแก้ไขปัญหา
Mubashar

80

ฉันแก้ไขปัญหาโดยทำสิ่งต่อไปนี้:

  1. File > Workspace settingsไปที่
  2. คลิกลูกศรขวาเล็ก ๆ ข้าง "ข้อมูลที่ได้รับ" นี่เป็นการเปิดแอพ Finder ที่ตำแหน่งของDerivedDataโฟลเดอร์
  3. เข้าไปข้างในDerivedDataโฟลเดอร์แล้วลบโฟลเดอร์ที่เกี่ยวข้องกับโครงการของคุณ
  4. ออกจาก Xcode และเปิดใหม่อีกครั้ง
  5. shiftcommandkทำความสะอาดโครงการของคุณ
  6. commandbสร้างโครงการของคุณ
  7. เปิดกระดานเรื่องราวของคุณ
  8. Editor > Refresh all viewsไปที่

Updated

บางครั้งก็ไปEditor > Refresh all viewsทำงานโดยตรง หากRefresh all viewsปิดใช้งานอยู่ให้ออกจาก Xcode แล้วลองอีกครั้ง


ขอขอบคุณสำหรับการโพสต์นี้. ฉันลบบรรทัดคำสั่ง "โรงเรียนเก่า" ของข้อมูลที่ได้รับมา แต่ปัญหายังคงอยู่ การใช้วิธีการของคุณสามารถแก้ไขปัญหาให้ฉันได้
Adrian

รีเฟรชทุกมุมมองเพื่อชัยชนะสำหรับฉันเช่นกัน ขอบคุณ!
Mike K.

56

ฉันเพียงแค่ลบมุมมองที่ล้มเหลวและกดคำสั่ง + Z เพื่อยกเลิกการลบ มันใช้งานได้สำหรับฉัน

หากการแก้ไขมุมมองที่ล้มเหลวในภายหลังข้อผิดพลาดอาจเกิดขึ้นอีกทำตามข้างบนอีกครั้ง


6
มันไร้สาระ แต่ทำงานได้ดี
Ansari

1
น่ากลัว !! ทำงานให้ฉัน
Nupur Sharma

1
ใครจะรู้ว่ามันอาจเป็นคำตอบ มันใช้ได้ผลฉันยังไม่อยากจะเชื่อเลย
ซาดอโมดิ

37

ฉันประสบปัญหานี้ใน CocoaPod 1.5.0 วิธีแก้ไขคือติดตั้งพ็อดใหม่อีกครั้ง (ติดตั้งพ็อดอีกครั้ง) เมื่อเกิดข้อผิดพลาดนี้ขึ้นหรือคุณอาจใช้ CocoaPod 1.4.0 แทน มันทำงานได้ดีใน 1.4.0 (อย่างน้อยสำหรับฉัน)

อัปเดต:

เพิ่มสคริปต์ต่อไปนี้ใน Podfile ช่วยฉันแก้ปัญหาใน 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

การอ้างอิง: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911


จริง 100% ปรับลดรุ่นเป็น 1.4.0 แก้ไขปัญหาให้ฉัน
ale_stro

4
ทำงานได้ 1.5.0 ฝัก
Andrey Oshev

3
มันs work for me, you should add จบ `ถึงรหัสสุดท้าย
mahdi

1
ทำงานให้ฉันเช่นกัน ลองคำแนะนำอื่น ๆ ทั้งหมดโดยไม่ประสบความสำเร็จ ทดสอบกับฝัก 1.3.1
Sal

18

การเพิ่มรหัสต่อไปนี้ใน@IBDesignableชั้นเรียนของฉันเป็นการหลอกลวง

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

มันใช้งานได้สำหรับฉัน UITextViewในความเป็นจริงผมเพิ่มอีกสองแทนที่สำหรับการขยาย (1) init(frame: CGRect, textContainer: NSTextContainer?), init?(coder aDecoder: NSCoder)(2) จากนั้นสร้างใหม่และเตือน (ข้อผิดพลาด) หายไป ไม่จำเป็นต้องล้างโฟลเดอร์บิลด์ด้วย
John Pang

ขอบคุณ! คำตอบที่ดี)
JiosDev

13

สำหรับใครที่ชอบฉัน - ใครไม่พบIBDesignablesAgentCocoaTouchไฟล์นั้นหรือเมื่อพยายาม 'ดีบั๊กมุมมองที่เลือก' จากตัวแก้ไขจะได้รับข้อผิดพลาดต่อไปนี้เป็นอีกวิธีในการแก้ไขข้อผิดพลาด "ล้มเหลวในการแสดงผล"

เปิดแอป 'คอนโซล' จากแถบด้านข้างเลือก Mac ปัจจุบันของคุณ (ซึ่งอาจจะถูกเลือกอัตโนมัติตามค่าเริ่มต้น) จากนั้นในแถบค้นหาค้นหา "IBSceneUpdate" และกด Enter

ด้วยวิธีนี้ทุกครั้งที่คุณได้รับข้อผิดพลาด Xcode สำหรับการIBDesignableไม่สามารถแสดงผลได้คุณจะได้รับรายการ "IBSceneUpdate" ใหม่พร้อมด้วยรายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาด

อย่างน้อยฉันก็สามารถแก้ไขIBDesignableข้อผิดพลาดของฉันได้!

แอปคอนโซลแสดงข้อผิดพลาด IBSceneUpdate


1
แอปนี้เป็นคอนโซลจริงไม่ใช่เทอร์มินัลเหมือนกับ FYI
Carl Upton

จับดี! แก้ไขคำตอบของฉัน
Stelabouras

12

หากคุณใช้ไฟล์ xib สำหรับ uiview ที่กำหนดเอง ลองสิ่งนี้:

เปลี่ยนจาก

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

ถึง:

let bundle = Bundle(for: UserView.self) 
bundle.loadNibNamed("UserView", owner: self, options: nil)

8

ลองปิดการใช้งาน 'ใช้ชุดรูปแบบลักษณะ' (Identity and Type) สำหรับไฟล์ xib ใด ๆ ที่คุณอาจมีสำหรับมุมมองที่กำหนดเองที่ใช้ในกระดานเรื่องราวของคุณ


7

ปัญหาของฉันได้รับการแก้ไขโดยการลบโฟลเดอร์ (ซึ่งเกี่ยวข้องกับโครงการนี้) จากโฟลเดอร์ข้อมูลที่ได้รับ คุณสามารถทำได้โดยคลิกที่ไฟล์ -> การตั้งค่าโครงการ -> จากนั้นคลิกที่เครื่องหมายลูกศร deside /Users/.../Xcode/DerivedData คลิกโฟลเดอร์ DerivedData ที่คุณจะเห็นโครงการของคุณชื่อโฟลเดอร์ลบเหล่านั้น ออกจาก xcode เปิดโครงการของคุณทำความสะอาดโครงการโดยใช้ขั้นตอนนี้ Product-> clean จากนั้นสร้างโครงการ: Product-> Build สิ่งเหล่านี้จะแก้ไขปัญหานี้ได้


4

คำตอบที่ถูกต้องให้โดย @Maria :

ตรวจสอบรายงานข้อขัดข้องที่ ~/Library/Logs/DiagnosticReports

ทางเลือก :

  1. เปิด Spotlight

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

  1. ชนิด console.app

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

  1. เลือก Crash reports

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

  1. เลือกหนึ่งรายการIBDesignablesAgent-iOSและตรวจสอบบันทึกข้อผิดพลาด

การใช้ Console เป็นสิ่งที่ช่วยให้ฉันแก้ปัญหาได้ ข้อความที่มีรายละเอียดมากกว่าสิ่งที่อยู่ใน Xcode
Andrew Moore


3

ฉันพยายามที่สะอาดและเรียกใช้โครงการจะไม่แก้ปัญหานี้

แต่ปิดและเปิดโครงการอีกครั้ง


2

เมื่อฉันดีบั๊กฉันพบว่ามีบางคลาสที่ปรับเปลี่ยน UI โดยทั่วไปแล้ว marquelabel ซึ่งเป็นคลาสย่อยของ UILabel หรือคลาสอื่น ๆ ของคลาสย่อย UIView และวาด UI ในเวลาทำงานและชนกับเอ็นจิ้น Autolayout ลองให้ความกว้างหรือความสูงคงที่สำหรับมุมมองที่กำหนดเองเหล่านี้ หากวิธีนี้ไม่ช่วยแก้ปัญหาของคุณลองทำตามแนวทางแก้ไข: -

โซลูชันที่ 1: - Unusement #use_frameworks ในไฟล์พ็อดของคุณ

โซลูชันที่ 2: - ลองลบข้อมูลที่ได้มา

  1. ปิดหน้าต่างตัวแก้ไขของ Xcode ของคุณและออกจากโปรแกรมจำลอง ->
  2. ไปที่การตั้งค่า Xcode -> ตำแหน่งที่ตั้ง ->
  3. คลิกที่ลูกศรสีเทาเล็ก ๆ ที่แสดงเส้นทางข้อมูลที่ได้รับ ->
  4. เลือกโครงการของคุณ ->
  5. ลบโฟลเดอร์ทั้งหมดภายใน ->
  6. ออกจาก Xcode และเปิดใหม่

1
คุณช่วยอธิบายรายละเอียดเกี่ยวกับวิธีการแก้ปัญหาได้จริงหรือไม่?
พอลล่า Hasstenteufel

นี้แก้ไขปัญหาได้ แต่ยังไม่รู้ว่าทำไม uncoment ที่ use_frameworks เพราะนั่นเป็นโครงการที่รวดเร็ว
Abhishek

Podfile ของฉันใช้เฟรมเวิร์กอยู่แล้วคำแนะนำใด ๆ
mmr118

@ moni15 ฉันได้เพิ่มอีกวิธีหนึ่งที่เป็นไปได้ โปรดตรวจสอบ.
Ashish Pisey

การเลิกใช้ #use_frameworks ในไฟล์พ็อดและการล้างข้อมูล DerivedData นั้นเหมาะกับฉัน
Jugal Desai

2

ฉันมีปัญหาเดียวกันและมาที่นี่เพื่อลองคิดดูว่าเกิดอะไรขึ้น ผมสังเกตเห็นด้านบนคำตอบการจัดอันดับและคำตอบตัวเองไม่ได้ช่วยให้ฉันเป็น IBDesignable ไม่ได้อยู่ในโฟลเดอร์บันทึกและฉันพยายามที่ตัวเลือกอื่น ๆ ทั้งหมดที่มี แต่ในความคิดเห็นผมสังเกตเห็นคนที่พูดคุยเกี่ยวกับ init กรอบ

ฉันตัดสินใจลองแสดงความคิดเห็นส่วนขยาย IBDesignable ของฉันสำหรับ UIView และแก้ไขปัญหาได้ทันที ดังนั้นในการแก้ไขปัญหานี้ให้ค้นหาส่วนขยายที่ทำให้เกิดปัญหาและตรวจสอบให้แน่ใจว่าได้ตั้งค่า inits ที่ต้องการโดยการสร้างคลาส IBDesignable และจัดเตรียมค่าเริ่มต้นที่จำเป็นดังนี้:

@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() {
}
}

สำคัญ: อย่าลืมเพิ่มคลาสใหม่ให้กับรายการที่คุณใช้งานได้


1
ตามที่เอกสารระบุไว้อย่าลืมเรียก super.prepareForInterfaceBuilder () ในการใช้งานของคุณ prepareForInterfaceBuilder ()
Jaime S

1

ประสบข้อผิดพลาดเดียวกัน: มีการกำหนด UITextField เองและใช้ตัวสร้างส่วนต่อประสานข้อผิดพลาดในคอนโซลคือ - การใช้ initializer ที่ยังไม่ได้ใช้ 'init (frame :)' สำหรับคลาส "CustomField"

เพิ่มผู้เริ่มต้นเพื่อแก้ไขข้อผิดพลาด


1

ฉันประสบปัญหานี้หลังจากอัปเดตเป็นรุ่น XCode ล่าสุดหลังจากลองใช้วิธีแก้ปัญหาหลายวิธีที่อธิบายไว้ข้างต้นฉันแค่ Xcode แล้วปิดระบบและเปิดใช้งานและใช้งานได้สำหรับฉัน


0

หลังจากที่คุณทำการเปลี่ยนแปลงที่จำเป็นเปลี่ยนกระดานเรื่องราวหรือในกรณีของฉันเป็น. xib เพื่อเปิดใน "XCode 7" บันทึกและปิด นี่เป็นเพียงมาตรการหยุดช่องว่างเพื่อแก้ไขข้อผิดพลาด แต่ท้ายที่สุดคุณจะต้องแก้ไขหรือทำสิ่งนี้จนกว่าคุณจะไม่สามารถทำได้อีกต่อไป


0

ในกรณีของฉันฉันถูกใช้ห้องสมุดซึ่ง UIViewsubclassing มันถูกใช้และได้รับการเรียกร้องให้หายไปIB_DESIGNABLE [super awakeFromNib]เมื่อฉันเพิ่มการโทรไปยังวิธีนี้แล้วข้อผิดพลาดก็หายไป

ฉันไม่แน่ใจว่าการใช้งานจริงIB_DESIGNABLEมีผลกระทบกับเรื่องนี้หรือไม่


คุณเพิ่มรหัสสำหรับ [super awakeFromNib] ที่ไหน คุณแชร์รหัสของคุณได้ไหม
TheJeff

0

นี่เป็นวิธีที่ง่ายที่สุดสำหรับฉัน: เพิ่มสคริปต์นี้ในของคุณ 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

ที่มา:

วิธีแก้ปัญหาสำหรับ @IBDesignable นี้อยู่ที่นี่: https://github.com/CocoaPods/CocoaPods/issues/5334

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