Xcode 8 - IB Designables - Không thể kết xuất và cập nhật trạng thái bố cục tự động, Tác nhân bị lỗi


167

Gần đây tôi đã nâng cấp lên Xcode 8 và tôi gặp sự cố với Storyboard.

Nếu tôi mở dự án và tôi không mở Storyboard, nó sẽ biên dịch và chạy tốt. Khi tôi mở Storyboard, tôi gặp nhiều lỗi về Thiết kế IB như hình bên dưới.

nhập mô tả hình ảnh ở đây

Các chế độ xem này là các chế độ xem duy nhất đang sử dụng các chế độ xem tùy chỉnh TextFieldEffectsBEMCheckboxtôi đã nhập bằng Cocoapods.


Có thể kiểm tra kho lưu trữ cho Pod bạn đang sử dụng và xem vấn đề này có phổ biến trong số những người dùng khác không?
Zolnoor

Bất kỳ câu trả lời có liên quan đến điều này?
Mohsin Khubaib Ahmed

1
Các bạn có tìm thấy cách giải quyết nào không?
nhúng

Xem ra, vấn đề có thể là BẠN CẦN MỘT BUILD FAT cho một thư viện nhúng . trong ví dụ của tôi, tôi đã nhúng Swifter. Đương nhiên, bạn tiếp tục xây dựng một bản dựng béo (để phát triển - giả lập / điện thoại) và bản dựng chỉ dành cho điện thoại (chỉ dành cho cửa hàng ứng dụng, chỉ dành cho điện thoại) và bạn chỉ cần trao đổi với một bản duy nhất cho điện thoại khi cần gửi tới TestFlight, v.v. có thư viện chỉ dành cho điện thoại trong dự án !!!!! Đừng! Trao đổi chất béo "chính xác" đã khắc phục vấn đề.
Fattie

Câu trả lời:


179

Bạn có thể thử một trong những cách sau để tìm ra nguyên nhân:

  1. tìm kiếm các IBDesignablesAgentCocoaTouchbản ghi trong thư mục này: ~/Library/Logs/DiagnosticReportsvà xem nguyên nhân.

Lưu ý: đối với người dùng có Catalina: hãy tìm IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Chuyển đến Trình chỉnh sửa -> Gỡ lỗi Chế độ xem được chọn trong khi chọn @IBDesignable UIViewtrong bảng phân cảnh của bạn và xem dấu vết ngăn xếp.

  2. Xóa thư mục Derive Data.

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
    
  3. Làm sạch dự án của bạn Shift + Command + Alt + K .

  4. Xây dựng dự án của bạn Command + B .


35
Sử dụng phương pháp này tôi đã có thể tìm ra lý do là Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Tôi không biết rằng IBDesignablesAgentCocoaTouchcác cuộc gọi quá trình init(frame:), thay vì init?(coder aDecoder:).
Yevhen Dubinin

5
@YevhenDubinin Cảm ơn bạn, điều này đã giúp tôi. Mọi thứ đều ổn sau khi tôi triển khai init(frame:)trong lớp con UIButton của mình
doraemon

2
Điều này đã khắc phục sự cố của tôi, nhưng tôi đã phải thoát xCode trước khi xóa dữ liệu dẫn xuất
Husam

2
câu trả lời hay nhất init (khung :) là vấn đề phổ biến
Michał Ziobro

1
Thoát xcode và xóa DeruredData. Nó giải quyết vấn đề.
Mubashar

80

Tôi đã giải quyết vấn đề bằng cách làm như sau:

  1. Tới File > Workspace settings.
  2. Nhấp vào mũi tên nhỏ bên phải bên cạnh "Dữ liệu đã tạo". Điều này sẽ mở ứng dụng Finder tại vị trí của DerivedDatathư mục.
  3. Đi vào bên trong DerivedDatathư mục và xóa thư mục tương ứng với dự án của bạn.
  4. Thoát Xcode và mở lại.
  5. Làm sạch dự án của bạn shiftcommandk.
  6. xây dựng dự án của bạn commandb.
  7. Mở bảng phân cảnh của bạn.
  8. Tới Editor > Refresh all views.

Đã cập nhật

Đôi khi chỉ cần trực tiếp đi Editor > Refresh all viewslàm. Nếu Refresh all viewsbị tắt, hãy thoát Xcode và thử lại.


Cảm ơn vì đã đăng tải điều này. Tôi đã xóa một dòng lệnh "trường học cũ", nhưng vấn đề vẫn tồn tại. Sử dụng phương pháp của bạn đã giải quyết vấn đề cho tôi.
Adrian

Làm mới tất cả các quan điểm cho chiến thắng cho tôi là tốt. Cảm ơn!
Mike K.

56

Tôi chỉ xóa chế độ xem bị lỗi và nhấn lệnh + Z để hoàn tác xóa. Nó làm việc cho tôi.

Nếu chỉnh sửa chế độ xem không thành công sau này, lỗi có thể xảy ra lần nữa, hãy thực hiện lại ở trên.


6
Nó vô lý nhưng nó đã làm việc.
Ansari

1
Tuyệt vời!! Làm việc cho tôi
Nupur Sharma

1
Ai biết nó có thể là câu trả lời. Nó vẫn hoạt động mà tôi vẫn không thể tin được
Asad Amodi

37

Tôi đã phải đối mặt với vấn đề này trong Cốc Cốc 1.5.0. Giải pháp là cài đặt lại pod một lần nữa (cài đặt lại pod một lần nữa) khi lỗi này hiển thị hoặc thay vào đó bạn có thể sử dụng CocoaPod 1.4.0. Nó hoạt động tốt trong 1.4.0 (ít nhất là đối với tôi.)

cập nhật:

Thêm tập lệnh sau trong Podfile giúp tôi giải quyết vấn đề trong 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

tham khảo: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911


đúng 100. hạ cấp xuống 1.4.0 đã giải quyết vấn đề cho tôi.
ale_stro

4
Đã làm việc, 1.5.0 vỏ.
Andrey Oshev

3
nó kết s work for me, you should add thúc `đến cuối mã.
mahdi

1
Làm việc cho tôi là tốt. Đã thử tất cả các đề xuất khác không có thành công. Đã thử nghiệm với Pods 1.3.1
Sal

18

Thêm mã sau vào @IBDesignablelớp của tôi đã làm thủ thuật.

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

Điều này làm việc cho tôi. Trong thực tế, tôi đã thêm hai ghi đè để mở rộng UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Sau đó xây dựng lại và cảnh báo (lỗi) đi. Thậm chí không cần phải dọn dẹp thư mục xây dựng.
John Pang

Cảm ơn! Câu trả lời hay)
JiosDev

13

Đối với bất kỳ ai - như tôi - những người không thể tìm thấy IBDesignablesAgentCocoaTouchtệp đó hoặc khi cố gắng 'Gỡ lỗi Chế độ xem được chọn' từ Trình chỉnh sửa bị lỗi, đây là một cách khác để gỡ lỗi các lỗi "Không thể kết xuất".

Mở ứng dụng 'Bảng điều khiển', từ thanh bên chọn máy Mac hiện tại của bạn (có thể nó sẽ được tự động chọn theo mặc định) và sau đó trên thanh tìm kiếm tìm kiếm "IBSceneUpdate" và nhấn enter.

Bằng cách này, mỗi khi bạn gặp lỗi Xcode do IBDesignablekhông thể kết xuất, bạn cũng sẽ nhận được mục "IBSceneUpdate" mới với nhiều chi tiết hơn về lỗi.

Ít nhất đó là cách tôi có thể gỡ IBDesignablelỗi!

Ứng dụng bảng điều khiển hiển thị lỗi IBSceneUpdate


1
Ứng dụng này là Console thực tế chứ không phải Terminal giống như một FYI.
Carl Upton

Nắm bắt tốt! Chỉnh sửa câu trả lời của tôi.
Stelabouras

11

Nếu bạn đang sử dụng tệp xib cho uiview tùy chỉnh. Thử cái này:

Thay đổi từ

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

Đến:

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

8

Cố gắng vô hiệu hóa 'Sử dụng biến thể Trait' (bảng nhận dạng và loại) cho bất kỳ tệp xib nào bạn có thể có cho các chế độ xem tùy chỉnh được sử dụng trong bảng phân cảnh của bạn.


7

vấn đề của tôi đã được giải quyết bằng cách xóa các thư mục (có liên quan đến dự án này) khỏi thư mục dữ liệu dẫn xuất. bạn có thể làm điều này bằng cách nhấp vào Tệp -> Cài đặt dự án -> sau đó nhấp vào dấu mũi tên deside /Users/.../Xcode/DerivingData nhấp vào thư mục DeruredData bạn sẽ thấy các thư mục có tên dự án của bạn sẽ xóa các thư mục đó. thoát xcode mở dự án của bạn, làm sạch dự án bằng cách sử dụng bước này Sản phẩm-> làm sạch sau đó xây dựng dự án: Sản phẩm-> Xây dựng Những điều này sẽ giải quyết vấn đề này.


4

Câu trả lời đúng được cung cấp bởi @Maria :

kiểm tra báo cáo sự cố tại ~/Library/Logs/DiagnosticReports

Cách khác :

  1. mở Spotlight

nhập mô tả hình ảnh ở đây

  1. kiểu console.app

nhập mô tả hình ảnh ở đây

  1. lựa chọn Crash reports

nhập mô tả hình ảnh ở đây

  1. kiểm tra một IBDesignablesAgent-iOSvà xem xét nhật ký sự cố

Sử dụng Console là thứ giúp tôi giải quyết vấn đề của mình. Thông báo chi tiết hơn nhiều so với những gì có trong Xcode.
Andrew Moore

3

Chỉ cần mở bảng phân cảnh của bạn -> Trình chỉnh sửa -> Làm mới tất cả các lượt xem. Công việc này cho tôi.


3

Tôi đã cố gắng làm sạch và chạy dự án sẽ không giải quyết vấn đề này.

Nhưng Đóng và mở lại dự án đã làm.


2

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
Bạn có thể giải thích làm thế nào điều này thực sự giải quyết vấn đề?
Paula Hasstenteufel

điều này đã giải quyết được vấn đề nhưng vẫn không biết tại sao lại không sử dụng mà sử dụng các công cụ này vì đó là dự án nhanh chóng
Abhishek

Podfile của tôi đã sử dụng các khung công tác, có bất kỳ đề xuất nào trước đây không chú ý đến điều đó không?
mmr118

@ moni15 tôi đã thêm một giải pháp có thể. Hãy kiểm tra.
Ashish Pisey

Bỏ ghi chú #use_frameworks trong tệp pod và xóa DeruredData làm việc cho tôi.
Joly Desai

2

Tôi có cùng một vấn đề và đến đây để thử và tìm hiểu những gì đã xảy ra. Tôi nhận thấy câu trả lời được xếp hạng hàng đầu và chính câu trả lời đã không giúp tôi, vì IBDesignable không tồn tại trong thư mục nhật ký và tôi đã thử tất cả các tùy chọn khác ở đó, tuy nhiên trong các nhận xét tôi nhận thấy ai đó nói về init init.

Tôi đã quyết định thử nhận xét tiện ích mở rộng IBDesignable của mình cho UIView và nó đã khắc phục ngay sự cố. Vì vậy, để khắc phục điều này, hãy tìm tiện ích mở rộng gây ra sự cố và đảm bảo thiết lập các mức yêu cầu bằng cách tạo một lớp IBDesignable và cung cấp các trình khởi tạo được yêu cầu như sau:

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

QUAN TRỌNG: hãy nhớ thêm lớp mới vào mục bạn đang sử dụng có thể thiết kế trên.


1
Như tài liệu của nó nói, đừng quên gọi super.prepareForInterfaceBuilder () trong quá trình bạn thực hiện chuẩn bịForForInterfaceBuilder ().
Jaime S

1

Lỗi tương tự: Đã tùy chỉnh UITextField và sử dụng trình xây dựng giao diện, lỗi trong bảng điều khiển là -Sử dụng trình khởi tạo chưa được thực hiện 'init (frame :)' cho lớp "CustomField"

Đã thêm trình khởi chạy để sửa lỗi


1

Tôi đã gặp phải vấn đề này sau khi cập nhật lên phiên bản XCode mới nhất. Sau khi thử nhiều giải pháp được mô tả ở trên, tôi chỉ sử dụng Xcode và tắt hệ thống và bật nó lên và nó hoạt động với tôi.


0

Sau khi bạn thực hiện các thay đổi cần thiết, hãy thay đổi bảng phân cảnh hoặc trong trường hợp của tôi là .xib để mở trong "XCode 7", lưu và đóng. Đây chỉ là một biện pháp ngăn chặn để giải quyết các lỗi nhưng cuối cùng bạn sẽ cần sửa chúng hoặc làm điều này cho đến khi bạn không còn có thể.


0

Trong trường hợp của tôi, tôi đã sử dụng một thư viện phân lớp UIView. Nó đang sử dụng IB_DESIGNABLE, và đã thiếu cuộc gọi đến [super awakeFromNib]. Khi tôi đã thêm lệnh gọi phương thức này, lỗi sẽ biến mất.

Tôi không chắc liệu thực tế rằng nó đang được thực hiện IB_DESIGNABLEcó ảnh hưởng đến việc này không.


Bạn đã thêm mã cho [super awakeFromNib] ở đâu? Bạn có thể chia sẻ mã của bạn?
TheJeff 16/03/19

0

Đây là cách dễ nhất đối với tôi: thêm tập lệnh này vào 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

Nguồn:

Cách giải quyết này cho @IBDesignable có thể được tìm thấy ở đây: https://github.com/CocoaPods/CocoaPods/issues/5334

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.