@ ข้อผิดพลาดที่สามารถออกแบบได้: IB Designables: ไม่สามารถอัปเดตสถานะการจัดวางอัตโนมัติ: Interface Builder Cocoa Touch Tool ขัดข้อง


157

ฉันมีคลาสย่อยที่ง่ายมากของ UITextView ที่เพิ่มฟังก์ชัน "Placeholder" ที่คุณสามารถหาค่าเนทิฟไปยังวัตถุ Text Field นี่คือรหัสของฉันสำหรับคลาสย่อย:

import UIKit
import Foundation

@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
    @IBInspectable var placeholder: String = "" {
        didSet {
            setPlaceholderText()
        }
    }
    private let placeholderColor: UIColor = UIColor.lightGrayColor()        
    private var textColorCache: UIColor!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.delegate = self
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.delegate = self
    }
    
    func textViewDidBeginEditing(textView: UITextView) {
        if textView.text == placeholder {
            textView.text = ""
            textView.textColor = textColorCache
        }
    }
    
    func textViewDidEndEditing(textView: UITextView) {
        if textView.text == "" && placeholder != "" {
            setPlaceholderText()
        }
    }
    
    func setPlaceholderText() {
        if placeholder != "" {
            if textColorCache == nil { textColorCache = self.textColor }
            self.textColor = placeholderColor
            self.text = placeholder
        }
    }
}

หลังจากเปลี่ยนคลาสสำหรับUITextViewวัตถุใน Identity Inspector เป็นPlaceholderTextViewฉันสามารถตั้งค่าPlaceholderคุณสมบัติได้ดีใน Attribute Inspector รหัสทำงานได้ดีเมื่อเรียกใช้แอป แต่ไม่แสดงข้อความตัวยึดตำแหน่งในเครื่องมือสร้างส่วนต่อประสาน ฉันยังได้รับข้อผิดพลาดที่ไม่บล็อกดังต่อไปนี้ (ฉันคิดว่านี่เป็นสาเหตุที่มันไม่ได้แสดงผลในเวลาออกแบบ):

ข้อผิดพลาด: IB Designables: ไม่สามารถอัปเดตสถานะโครงร่างอัตโนมัติ: เครื่องมือสร้างส่วนต่อประสาน Cocoa Touch Tool ล้มเหลว

ข้อผิดพลาด: IB Designables: ไม่สามารถแสดงอินสแตนซ์ของ PlaceholderTextView: การแสดงมุมมองใช้เวลานานกว่า 200 ms รหัสรูปวาดของคุณอาจประสบกับประสิทธิภาพที่ช้า

ฉันไม่สามารถหาสาเหตุที่ทำให้เกิดข้อผิดพลาดเหล่านี้ได้ ข้อผิดพลาดที่สองไม่สมเหตุสมผลเลยเนื่องจากฉันไม่ได้เอาชนะ drawRect () ความคิดใด ๆ


1
ฉันได้รับข้อผิดพลาดนี้ วัตถุทำงานได้ดีในโครงการทดสอบ แต่ไม่ใช่ในโครงการหลักของฉัน (ในตาราง) ตามที่developer.apple.com/library/mac/recipes/…ฉันเลือกเลือกเครื่องมือแก้ไข> ตรวจแก้จุดบกพร่องที่เลือก จากนั้นฉันได้รับ "ไม่สามารถดีบักมุมมอง" "ตรวจสอบให้แน่ใจว่ากรอบงานของคุณมีการตั้งค่าบิลด์ที่ถูกต้องสำหรับการสร้างสำหรับ iOS" ไม่มีข้อผิดพลาดเกิดขึ้นใน Google
Matt

คำตอบ:


238

มีรายงานข้อขัดข้องที่สร้างขึ้นเมื่อเครื่องมือสร้างส่วนต่อประสานของเครื่องมือสร้างส่วนติดต่อเกิดขัดข้อง วิทยานิพนธ์อยู่ในชื่อ~/Library/Logs/DiagnosticReports IBDesignablesAgentCocoaTouch_*.crashในกรณีของฉันพวกเขามีการติดตามสแต็คที่มีประโยชน์ที่ระบุปัญหาในรหัสของฉัน


1
ขอบคุณ! นี่เป็นประโยชน์มาก! คุณพบข้อมูลเกี่ยวกับรายงานข้อขัดข้องที่ไหน :)
Ben-G

57
ในกรณีของฉันฉันค้นพบว่าinitFrame(frame: CGRect)ต้องกำหนดไว้ ทำเช่นนั้นหากคุณให้initวิธีการของคุณเอง
เทรวิส

นี่เป็นทางออกที่ดีที่สุด ฉันไม่ได้ใช้งาน initWithFrame ในหนึ่งในมุมมอง
HotFudgeSunday

3
ฉันใช้รายงานการวินิจฉัยและเช่นเดียวกับ @Travis ที่กล่าวถึงฉันต้องการแทนที่init(frame: CGRect)อย่างชัดเจนเพราะฉันมีiniวิธีการที่กำหนดเอง คุณอาจต้องการตรวจสอบรายงานข้อขัดข้องว่าuse of unimplemented initializer 'init(frame:)'อยู่ภายใต้Application Specific Informationในรายงานโดยตรง ขอบคุณเพื่อน! ชนะสองเท่าในคำตอบนี้!
Chris

4
ตามปกติไฟล์บันทึกนี้ยังมีอยู่ในแอปConsole macOS ภายใต้กลุ่มรายงานการวินิจฉัยผู้ใช้
เปาโล Mattos

51

ฉันมีปัญหาเดียวกันสองสามครั้ง ทั้งสองครั้งเริ่มต้นเมื่อฉันโหลดไส้ปากกา IBDesignable ลงในกระดานเรื่องราวเมื่อปลายปากกาไม่สามารถปรับให้พอดีกับมุมมองได้ (เช่นฉันมีปุ่มปิด UIView แต่ยังอยู่ในปลายปากกา) เมื่อฉันแก้ไขที่ Xcode ยังคงให้ข้อผิดพลาดกับฉันดังนั้นฉันเริ่ม Xcode ใหม่จนกว่ามันจะหยุดให้ฉันข้อผิดพลาดแบบสุ่ม

ฉันหวังว่านี่จะช่วยได้.

อัปเดต: ฉันเพิ่งฆ่ากระบวนการทั้งหมดที่มีชื่อว่า "เครื่องมือสร้างส่วนต่อประสานตัวสร้างโกโก้" รีสตาร์ท Xcode และข้อผิดพลาดหายไป ไม่ทราบว่าจะใช้งานได้หรือไม่


2
ในขณะที่ฉันยังไม่เข้าใจว่าทำไมหากคุณไม่ได้เขียนทับinitวิธีการใด ๆ รหัสที่โพสต์เป็นส่วนหนึ่งของคำถามจะไม่แสดงIB Designablesข้อผิดพลาดอีกต่อไปและตัวยึดตำแหน่งจะแสดงผลอย่างถูกต้องในเครื่องมือสร้างส่วนติดต่อ
Willington Vega

2
บางทีนี่อาจเป็นข้อผิดพลาดและเราแค่ต้องรอให้มันแก้ไข บางทีใน Xcode 6.3
Youssef Moawad

3
XCode 7.1.1 และยังคงอยู่ การรีสตาร์ท XCode ไม่สามารถแก้ปัญหาได้ ฉันต้องฆ่ากระบวนการทั้งหมดที่เรียกว่า Interface Builder Cocoa Touch Tool ด้วยตนเองแล้ว XCode ขัดข้องเริ่มต้นใหม่และเริ่มทำงานได้
Cristian Pena

1
จุดสำคัญ: แท้จริง FIRST ฆ่า Interface Builder กระบวนการแล้วหยุด XCode - ถ้าคุณทำมันวิธีอื่น ๆ ยังคงมีปัญหา ...
theeye

2
XCode 8.1 ยังคงเกิดข้อผิดพลาดนี้ เริ่มแรกเกิดจากการไม่มีการแทนที่ init แต่ยังคงอยู่หลังจากเพิ่ม init ต้องฆ่ากระบวนการตัวสร้างส่วนต่อประสานตามที่อธิบายแล้วรีสตาร์ท xcode เป็น @TheEye พูดว่า
John Fowler

39

ในกรณีของฉันฉันทำต่อไปในเมธอด initWithFrame / initWithCoder เพื่อสร้างมุมมอง:

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

ดูเหมือนว่าฉันไม่ควรใช้กลุ่มหลักแต่เป็นชุดกลุ่มแทน ดังนั้นฉันแทนที่รหัสดังต่อไปนี้และใช้งานได้:

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

ฉันคิดว่าบางทีนี่อาจช่วยใครซักคน


1
นี่เป็นการแก้ไขปัญหาของฉันด้วย! ขอบคุณ @jmoukel!
edopelawi

อันนั้นแก้ไขปัญหาของฉัน ชาย!!! ฉันไม่สามารถสังเกตเห็นได้ว่าบรรทัด "bundleForClass" แม้ว่าฉันจะมองเข้าไปในโซลูชันนี้สองสามครั้ง :(
elk_cloner

let bundle = Bundle(for: ValidatingTextField.self)ใน Swift
Cfr

14

คุณสามารถเลือกมุมมองของคุณเองใน Interface Builder และการใช้แล้ว ,Editor Debug Selected ViewsมันจะเปิดตัวIBDesignableAgentCocoaTouchเซสชันการดีบักที่เรียกว่าเมื่อเบรกพอยต์ทั้งหมด (รวมถึงเบรกพอยต์ข้อยกเว้น) ทำงานและคุณสามารถระบุสถานที่ที่มุมมองของคุณล่มได้


ที่สมบูรณ์แบบ! นี่ก็พบปัญหาของฉันเช่นกัน - แบบอักษรไม่ถูกต้อง ซึ่งอธิบายว่าเหตุใด IBDesignables ที่คล้ายกันเพียงหนึ่งในหกจึงล้มเหลว
zkarj

13

สำหรับXcode 8 - Swift

การเพิ่มค่าทางเลือกเป็นค่าเริ่มต้นในการ@IBInspectableทำให้เกิดปัญหาสำหรับฉัน

สิ่งนี้จะไม่ทำงาน:

@IBInspectable var repeatImage: UIImage = UIImage(named:"myImage")!{
      didSet {
       // configureView
      }
}

สิ่งนี้น่าจะใช้ได้:

@IBInspectable var repeatImage: UIImage = RepeatImageView.getDefaultImage() {
    didSet {
        // configureView()
    }
}

class func getDefaultImage() -> UIImage {
    if let defaultImage = UIImage(named: "myImage") {
        return defaultImage
    } else {
        return UIImage()
    }
}

@DungTran คุณประสบปัญหาใด
Mohammad Zaid Pathan

1
การจัดการที่เป็นตัวเลือกช่วยป้องกันความผิดพลาด แต่คุณรู้หรือไม่ว่าอะไรเป็นสาเหตุของ UIImage (ชื่อ :) เพื่อกลับศูนย์อย่างสม่ำเสมอ?
ScottyBlades

แสดงความคิดเห็นออกรหัสนี้คงมันสำหรับฉัน `@objc @available (*, เลิกเปลี่ยนชื่อเป็น "BackgroundColor") @IBInspectable var สาธารณะ signatureBackgroundColor: UIColor = สีขาวได้ {{didSet BackgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper

9

ฉันประสบปัญหาเกี่ยวกับตัวสร้างส่วนต่อประสานที่คล้ายกันที่ทำให้การออกแบบได้รับการออกแบบ

การใช้เทคนิคที่แนะนำในคำตอบนี้ฉันสามารถติดตามปัญหาการใช้ตัวอักษรของภาพ

การแสดงผลขัดข้อง

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")

ไม่มีการเรนเดอร์ผิดพลาด

self.backgroundImage.image =  UIImage(named: "rectangleCenter")

คุณเป็นฮีโร่
nathangitter

ความคิดใดที่ว่าทำไมตัวอักษรภาพไม่สอดคล้องกับ IB? ฉันมีปัญหาเดียวกัน
SwiftsNamesake

6

ที่จริงแล้วถ้าคุณมีคุณสมบัติเก่า ๆ ที่ ผู้ใช้กำหนด (ซึ่งไม่ถูกต้องสำหรับมุมมองปัจจุบัน) ที่มุมมองใด ๆ ในกระดานเรื่องราวของคุณซึ่งอาจทำให้เอเจนต์ของคุณพัง

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

หากทั้งสองอย่างไม่ได้ผลคุณอาจทำอะไรผิดไปเกี่ยวกับมุมมอง IBDesignable ของคุณดังนั้นให้เลือกมุมมองที่ล้มเหลวของคุณในกระดานเรื่องราวและดีบักโดยคลิกตัวแก้ไข> มุมมองการดีบัก


คุณเป็นของขวัญจากพระเจ้า
andrewcar

4

นี่ไม่ใช่กรณีสำหรับคำถามนี้ แต่บางทีฉันอาจจะช่วยคนอื่น

ฉันมีปัญหาที่คล้ายกันเมื่ออยู่ในชั้นเรียน @IBDesignable ฉันไม่ได้ติดตั้งทั้งสองอย่าง:

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

    // custom setup
}

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

    // custom setup
}

คุณควรใช้ทั้งสองวิธี init เสมอ เริ่มต้นด้วยเฟรมจะใช้เมื่อคุณเริ่มต้นมุมมองของคุณจากรหัสและ init ด้วย aDecoder ใช้จาก InterfaceBuilder
Skodik.o

4

ฉันมีปัญหาเดียวกันและฉันแก้ไขได้โดยเพิ่ม 'use_frameworks!' ไปที่ Podfile ของโครงการ

หวังว่ามันจะช่วยคุณ


สิ่งนี้ใช้ได้กับฉันเมื่อฉันมีปัญหากับ JVFloatLabeledTextField
saswanb

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันใช้โครงการ Obj-C รุ่นเก่าที่ล้าสมัยไปแล้ว IB สว่างขึ้นเหมือนต้นคริสต์มาสหลังจากนี้! ขอบคุณ.
วาด ..

3

ในกรณีของฉันมันเกี่ยวข้องกับกรอบคาร์เธจที่ฉันใช้อยู่ ฉันต้องเพิ่ม $ (PROJECT_DIR) / Carthage / Build / iOS ในการตั้งค่าการสร้างเส้นทางการค้นหา Runpath


หลังจากลองใช้วิธีแก้ไขปัญหาโพสต์อื่น ๆ ทั้งหมด ... นี่คือการแก้ไขเดียวที่เหมาะกับฉัน! ขอบคุณ!
Joel

3

ในกรณีของฉันมันเป็นปัญหาของ OneSignal เห็นได้ชัดว่าพวกเขามีข้อบกพร่องในรุ่น 2.2.0 ขึ้นไป เปลี่ยนเป็น 2.1.6 และทุกอย่างยอดเยี่ยมอีกครั้ง!

ตรวจสอบนี้


1

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

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

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


1

เพิ่มไปที่ด้านล่างของ Podfile ของคุณและเรียกใช้ pod install

# Workaround for Cocoapods issue #7606

    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

1

เพิ่มสคริปต์นี้ในตอนท้ายของฉันPodfileและดำเนินการpod installอีกครั้ง

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

1

ปัญหาสำคัญคือเมื่อคุณสร้าง @ IBDesignable ตรวจสอบให้แน่ใจว่าไฟล์cocoapodไม่รวมอยู่ใน UITests ไม่เช่นนั้นจะทำให้เกิดความผิดพลาดนี้


0

ฉันพบว่าเหตุผลคือ xib ของคุณมีขนาดไม่เท่ากันกับการออกแบบในกระดานเรื่องราว ตรวจสอบให้แน่ใจว่า xib มีความสูงและความกว้างเท่ากัน


0

ฉันเพิ่งหายไปบรรทัดรหัสนี้ platform :ios, '7.0' และปัญหาได้รับการแก้ไข เพียงแค่บรรทัดนี้ในไฟล์พ็อดของคุณและอัปเดตปัญหาพ็อดของคุณจะได้รับการแก้ไข


0

สำหรับฉันมันเป็นใบรับรองการลงนามที่ขาดหายไปเพราะฉันไม่เคยรันแอพดังนั้น Xcode จึงยังไม่ได้สร้างใบรับรอง เมื่อฉันรันแอพการIBDesignableแสดงผลก็ใช้ได้ดี


0

มันเหมือนกับว่าคุณได้รับรหัสจากผู้พัฒนารายอื่นและคุณได้รับข้อผิดพลาดนี้ เพียงแค่วิ่ง

pod install

สิ่งนี้ใช้ได้สำหรับฉัน หวังว่ามันจะช่วย


0

ตรวจสอบให้แน่ใจว่าคุณไม่ได้เริ่มต้นโดยตรงUIImageหรือUIFontใช้สินทรัพย์หรือแบบอักษรที่เพิ่มในโครงการของคุณ

ฉันมักจะสร้างprivate func setUp()ในชั้นเรียนที่@IBDesignableกำหนดเองของฉัน UIซึ่งถูกเรียกจาก,init(frame: CGRect) init?(coder aDecoder: NSCoder)ดังนั้นในที่สุดฉันก็อัพเดทsetup()สิ่งต่อไปนี้

private func setUp() {

     //... Doing initial configurations

     // iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
     if let icon = UIImage(named: "IconImageName") {
          iconImageView.image = icon
          iconImageView.frame.size = icon.size
     }

     // nameLabel.font =  UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
     if let font = UIFont(name: "Calibri-Light", size: size) {
          nameLabel.font =  font
     } else {
          nameLabel.font = UIFont.systemFont(ofSize: size) 
     }

     // Doing other stuffs
}

-1

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

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