Lỗi @IBDesignable: IB Designables: Không thể cập nhật trạng thái bố cục tự động: Trình tạo giao diện Công cụ cảm ứng ca cao bị lỗi


157

Tôi có một lớp con UITextView rất đơn giản có thêm chức năng "Giữ chỗ" mà bạn có thể tìm thấy tự nhiên cho đối tượng Trường văn bản. Đây là mã của tôi cho lớp con:

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
        }
    }
}

Sau khi thay đổi lớp cho UITextViewđối tượng trong Trình kiểm tra danh tính thành PlaceholderTextView, tôi có thể đặt thuộc Placeholdertính tốt trong Trình kiểm tra thuộc tính. Mã này hoạt động rất tốt khi chạy ứng dụng, nhưng không hiển thị văn bản giữ chỗ trong trình tạo giao diện. Tôi cũng nhận được các lỗi không chặn sau đây (tôi cho rằng đây là lý do tại sao nó không hiển thị tại thời điểm thiết kế):

lỗi: IB Designables: Không thể cập nhật trạng thái bố cục tự động: Interface Builder Ca cao Touch Tool bị lỗi

lỗi: IB Designables: Không thể hiển thị phiên bản của PlaceholderTextView: Hiển thị chế độ xem mất hơn 200 ms. Mã bản vẽ của bạn có thể bị hiệu suất chậm.

Tôi không thể tìm ra nguyên nhân gây ra những lỗi này. Lỗi thứ hai không có ý nghĩa gì, vì tôi thậm chí không ghi đè drawRect (). Có ý kiến ​​gì không?


1
Tôi đã nhận được lỗi này. Đối tượng làm việc tốt trong một dự án thử nghiệm, nhưng không phải trong dự án chính của tôi (trong một bảng). Theo developer.apple.com/l Library / mac / recipes /, tôi đã chọn Chọn Trình chỉnh sửa> Gỡ lỗi Chế độ xem được chọn. Sau đó, tôi nhận được "Không thể gỡ lỗi lượt xem" "Đảm bảo khung của bạn có cài đặt bản dựng chính xác để xây dựng cho iOS." Không có gì xảy ra trong Google cho lỗi này.
Matt

Câu trả lời:


238

Có các báo cáo sự cố được tạo khi Interface Builder Ca cao Touch Tool gặp sự cố. Luận án được đặt trong ~/Library/Logs/DiagnosticReportsvà được đặt tên IBDesignablesAgentCocoaTouch_*.crash. Trong trường hợp của tôi, chúng chứa một dấu vết ngăn xếp hữu ích xác định vấn đề trong mã của tôi.


1
Cảm ơn! Điều này là siêu hữu ích! Bạn đã tìm thấy thông tin về các báo cáo sự cố ở đâu? :)
Ben-G

57
Trong trường hợp của tôi, tôi phát hiện ra rằng initFrame(frame: CGRect)phải được xác định. Làm như vậy nếu bạn cung cấp init(các) phương pháp của riêng bạn .
Travis

Đây là giải pháp tốt nhất. Tôi đã không triển khai initWithFrame trên một trong các khung nhìn.
HotFudgeSunday

3
Tôi đã sử dụng các báo cáo chẩn đoán và như @Travis đã đề cập, tôi cần ghi đè một init(frame: CGRect)cách rõ ràng vì tôi có một iniphương pháp tùy chỉnh . Bạn có thể muốn xem qua báo cáo sự cố cho use of unimplemented initializer 'init(frame:)'trực tiếp Application Specific Informationtrong báo cáo. Cảm ơn các bạn! Nhân đôi chiến thắng trong câu trả lời này!
Chris

4
Như thường lệ, tệp nhật ký này cũng có sẵn trong ứng dụng Console macOS, trong nhóm Báo cáo chẩn đoán người dùng .
Paulo Mattos

51

Tôi đã có cùng một vấn đề một vài lần. Cả hai lần nó bắt đầu khi tôi đang tải ngòi IBDesignable lên bảng phân cảnh khi ngòi không thể vừa với tầm nhìn (tức là tôi đã tắt nút UIView nhưng vẫn ở ngòi). Khi tôi đã sửa lỗi Xcode đó vẫn báo lỗi, vì vậy tôi đã khởi động lại Xcode cho đến khi nó ngẫu nhiên dừng lại cho tôi lỗi.

Tôi hi vọng cái này giúp được.

CẬP NHẬT: Tôi vừa giết tất cả các quy trình có tên "Công cụ tạo giao diện ca cao giao diện", khởi động lại Xcode và lỗi đã biến mất. Không biết điều này sẽ luôn luôn làm việc hay không.


2
Mặc dù tôi vẫn không hiểu tại sao, Nếu bạn không ghi đè bất kỳ initphương thức nào, mã được đăng như một phần của câu hỏi không còn hiển thị IB Designableslỗi và trình giữ chỗ được hiển thị đúng trong Trình tạo giao diện.
Willington Vega

2
Có lẽ đây là một lỗi và chúng ta chỉ cần đợi nó được sửa. Có lẽ trong Xcode 6.3.
Youssef Moawad 1/03/2015

3
XCode 7.1.1 và vẫn còn. Khởi động lại XCode không giải quyết được vấn đề. Tôi đã phải tự hủy tất cả các quy trình được gọi là Interface Builder ca cao Touch Tool, sau đó XCode bị sập, khởi động lại và nó bắt đầu hoạt động.
Cristian Pena

1
Điểm quan trọng: Thực sự FIRST giết các quá trình xây dựng giao diện, sau đó dừng XCode - nếu bạn làm theo cách khác xung quanh vấn đề vẫn tồn tại ...
TheEye

2
XCode 8.1 lỗi này vẫn xảy ra. Nguyên nhân ban đầu là do không có ghi đè init nhưng vẫn tồn tại sau khi thêm init. Phải hủy các quy trình của Trình tạo giao diện như được mô tả THEN khởi động lại xcode như @TheEye nói
John Fowler

39

Trong trường hợp của tôi, tôi đã thực hiện tiếp theo trong các phương thức initWithFrame / initWithCoder để tạo chế độ xem:

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

Có vẻ như tôi không được phép sử dụng Gói chính , mà thay vào đó là gói của lớp. Vì vậy, tôi đã thay thế mã đó cho sau đây và nó đã hoạt động:

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

Tôi nghĩ có lẽ điều này có thể giúp ai đó.


1
Điều này đã khắc phục vấn đề của tôi quá! Cảm ơn @jmoukel!
edopelawi

Điều đó đã khắc phục vấn đề của tôi. Đàn ông!!! tôi không thể nhận thấy rằng dòng "bundleForClass" mặc dù tôi đã xem xét giải pháp này vài lần. :(
elk_cloner

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

14

Bạn có thể chọn giao diện tùy chỉnh của bạn trong Interface Builder và sử dụng sau đó Editor, Debug Selected Views. Nó sẽ khởi chạy cái gọi là IBDesignableAgentCocoaTouchphiên gỡ lỗi khi tất cả các điểm dừng (bao gồm các điểm dừng ngoại lệ) hoạt động và bạn có thể xác định chính xác vị trí mà chế độ xem của bạn gặp sự cố.


Hoàn hảo! Điều này cũng tìm thấy vấn đề của tôi - một phông chữ không chính xác. Điều này giải thích tại sao chỉ có một trong sáu IBDesignables rất giống nhau bị lỗi.
zkarj

13

Đối với Xcode 8 - Swift

Thêm giá trị tùy chọn làm giá trị mặc định @IBInspectablegây ra sự cố cho tôi.

Điều này sẽ không hoạt động:

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

Điều này sẽ làm việc:

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

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

@DungTran Bạn đang gặp phải vấn đề gì?
Mohammad Zaid Pathan

1
Xử lý tùy chọn ngăn ngừa sự cố. Nhưng bạn có biết điều gì đang khiến UIImage (được đặt tên :) trở lại không?
ScottyBlades

Cho ý kiến ra mã này cố định nó cho tôi `@objc @available (*, không dùng nữa, đổi tên thành: "backgroundColor") @IBInspectable var công signatureBackgroundColor: UIColor = .white {{didSet backgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper

9

Tôi đã gặp phải các vấn đề tương tự về Trình dựng giao diện.

Sử dụng kỹ thuật được đề xuất trong câu trả lời này, tôi có thể theo dõi vấn đề đối với việc sử dụng các hình ảnh bằng chữ.

Kết xuất sự cố

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

Không có sự cố kết xuất

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

Bạn là một anh hùng.
nathangitter

Bất cứ ý tưởng tại sao chữ nghĩa là không tương thích với IB? Tôi gặp vấn đề tương tự.
SwiftsNamesake

6

Trên thực tế nếu bạn có một số thuộc tính do người dùng xác định (không hợp lệ cho chế độ xem hiện tại) ở bất kỳ chế độ xem nào trong bảng phân cảnh của bạn, điều đó có thể khiến tác nhân của bạn gặp sự cố.

Bên cạnh đó, đôi khi nó xảy ra chỉ vì một lỗi Xcode khó chịu. Để kiểm tra, khi bạn ở bảng phân cảnh, bỏ chọn Trình chỉnh sửa> Tự động làm mới Chế độ xem, sau đó chuyển sang tệp khác, dọn dẹp và khởi động lại dự án của bạn. Sau khi bạn nhập lại bảng phân cảnh, bạn có thể nhấp vào Trình chỉnh sửa> Làm mới Chế độ xem và kiểm tra lại một lần nữa. Điều đó cũng đã giải quyết vấn đề của tôi một lần.

Nếu cả hai đều không hoạt động, thì có lẽ bạn đã làm gì đó sai về chế độ xem IBDesignable của mình, vì vậy hãy chọn các chế độ xem bị lỗi trong bảng phân cảnh và gỡ lỗi bằng cách nhấp vào Trình chỉnh sửa> Chế độ xem gỡ lỗi


Bạn là một món quà từ Chúa.
andrewcar

4

Đây không phải là trường hợp cho câu hỏi này, nhưng có lẽ tôi sẽ giúp người khác.

Tôi gặp vấn đề tương tự khi trong lớp @IBDesignable của tôi, tôi đã không thực hiện cả hai:

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

    // custom setup
}

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

    // custom setup
}

Bạn nên luôn luôn thực hiện cả hai phương thức init. Ban đầu với khung được sử dụng khi bạn khởi tạo chế độ xem từ mã và init với aDecoder được sử dụng từ InterfaceBuilder.
Skodik.o

4

Tôi đã có cùng một vấn đề và tôi đã giải quyết nó bằng cách thêm 'use_frameworks!' đến Podfile của dự án của tôi.

Hy vọng nó sẽ giúp bạn.


Điều này làm việc cho tôi khi tôi gặp vấn đề này với JVFloatLabeledTextField
saswanb

Đây là những gì làm việc cho tôi, áp dụng một dự án Obj-C cũ hơn đã lỗi thời. IB sáng lên như cây Giáng sinh sau này! Cảm ơn bạn.
đã vẽ ..

3

Trong trường hợp của tôi, nó liên quan đến khung carthage mà tôi đang sử dụng. Tôi đã phải thêm $ ( PRO DỰ_DIR ) / Carthage / Build / iOS vào cài đặt xây dựng Đường dẫn tìm kiếm Runpath


Sau khi thử tất cả các giải pháp được đăng khác ... đây là cách khắc phục duy nhất hiệu quả với tôi! Cảm ơn!
Joel

3

Trong trường hợp của tôi, đó là một vấn đề với OneSignal. Rõ ràng, họ có một lỗi trong phiên bản 2.2.0 trở lên. Chuyển sang 2.1.6 và mọi thứ lại tuyệt vời!

Kiểm tra này .


1

Khi tôi gỡ lỗi này, tôi phát hiện ra có một số lớp đang sửa đổi UI. Điển hình là marquelabel là một lớp con của UILabel hoặc bất kỳ lớp con nào khác UIView và vẽ ui trong thời gian chạy và va chạm với công cụ Autolayout. Hãy thử đưa ra chiều rộng hoặc chiều cao cố định cho các chế độ xem tùy chỉnh này. Nếu nó không giải quyết được vấn đề của bạn, hãy thử các giải pháp sau: -

Giải pháp 1: - Uncomment #use_frameworks bên trong tệp pod của bạn.

Giải pháp 2: - Thử xóa dữ liệu dẫn xuất. 1. Đóng cửa sổ Trình biên tập Xcode của bạn và thoát trình giả lập -> 2. Chuyển đến Tùy chọn Xcode -> Vị trí -> 3. Nhấp vào mũi tên nhỏ màu xám hiển thị đường dẫn dữ liệu dẫn xuất -> 4. Chọn dự án của bạn -> 5. Xóa tất cả các thư mục bên trong -> 6. Thoát Xcode và mở lại


1

Thêm nó vào dưới cùng của Podfile của bạn và chạy 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

Thêm tập lệnh này vào cuối của tôi Podfilevà thực hiện pod installlại.

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

Một vấn đề lớn là khi bạn đang tạo @ IBDesignable, hãy đảm bảo tệp cocoapod không được bao gồm trong UITests nếu không nó sẽ gây ra sự cố này.


0

Tôi thấy lý do là xib của bạn không cùng kích thước với thiết kế trong bảng phân cảnh. Hãy chắc chắn rằng xib có cùng chiều cao và chiều rộng.


0

Tôi chỉ thiếu dòng mã này platform :ios, '7.0' và vấn đề đã được giải quyết. Chỉ cần dòng này trong tệp pod của bạn và cập nhật vấn đề pod của bạn sẽ được giải quyết.


0

Đối với tôi đó là một chứng chỉ ký bị thiếu, vì tôi chưa bao giờ chạy ứng dụng, vì vậy Xcode chưa tạo chứng chỉ. Khi tôi chạy ứng dụng, IBDesignablekết xuất sẽ hoạt động tốt.


0

Giống như nếu bạn có Mã từ Nhà phát triển khác và bạn gặp lỗi này. Chỉ cần chạy

pod install

Điều này làm việc cho tôi. Hy vọng nó giúp.


0

Đảm bảo rằng bạn không trực tiếp khởi tạo UIImagehoặc UIFontsử dụng tài sản hoặc phông chữ được thêm vào trong dự án của bạn.

Tôi luôn tạo một private func setUp()trong @IBDesignablecác UIlớp tùy chỉnh của tôi . được gọi là từ init(frame: CGRect), init?(coder aDecoder: NSCoder). Vì vậy, cuối cùng tôi đã cập nhật setup()như sau.

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

Chỉ cần để nó xây dựng và chạy trên trình giả lập nếu bạn gặp lỗi ở một nơi khác trong dự án, chỉ cần nhận xét nó và chạy thiết kế trước để cập nhật có thể thiết kế và bỏ ghi chú các mã khác. Nó làm việc cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.