Xcode 8 - IB Designables - Gagal membuat dan memperbarui status tata letak otomatis, Agen macet

167

Baru-baru ini saya meningkatkan ke Xcode 8 dan saya mengalami masalah dengan Storyboard.

Jika saya membuka proyek dan saya tidak memiliki Storyboard terbuka, itu akan dikompilasi dan berjalan dengan baik. Setelah saya membuka Storyboard, saya mendapatkan banyak kesalahan tentang IB Designables seperti yang ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini

Tampilan ini adalah satu-satunya tampilan yang menggunakan tampilan kustom dari TextFieldEffectsdan BEMCheckboxyang saya impor menggunakan Cocoapods.

Alan
sumber
Mungkin memeriksa repositori untuk Pod yang Anda gunakan dan melihat apakah masalah ini lazim di antara pengguna lain?
Zolnoor
Adakah jawaban yang relevan untuk ini?
Mohsin Khubaib Ahmed
1
apakah kalian menemukan solusi?
celup
Awas, masalahnya bisa ANDA BUTUHKAN FAT BUILD untuk pustaka yang disematkan . dalam contoh saya, saya memiliki Swifter tertanam. Secara alami Anda tetap memiliki build yang gemuk (untuk pengembangan - simulator / telepon) dan build yang hanya untuk ponsel (untuk app store, hanya untuk ponsel) dan Anda hanya bertukar ke ponsel yang hanya dibutuhkan jika diperlukan untuk mengirim ke TestFlight dll. Saya masih memiliki perpustakaan khusus telepon di proyek !!!!! Doh! Bertukar dengan lemak "benar" pada masalah yang diperbaiki.
Fattie

Jawaban:

179

Anda dapat mencoba salah satu dari yang berikut untuk mencari tahu penyebabnya:

  1. cari IBDesignablesAgentCocoaTouchlog di direktori ini: ~/Library/Logs/DiagnosticReportsdan lihat penyebabnya.

Catatan: untuk pengguna dengan Catalina: cari IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. Pergi ke Editor -> Debug Selected View sambil memilih Anda @IBDesignable UIViewdi storyboard Anda, dan lihat jejak stack.

  2. Hapus folder Turunkan Data.

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
  3. Bersihkan proyek Anda Shift + Command + Alt + K .

  4. Bangun proyek Anda Command + B .

Maria
sumber
35
Dengan menggunakan pendekatan ini saya dapat mengetahui bahwa alasannya adalah Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'. Saya tidak tahu IBDesignablesAgentCocoaTouchproses itu memanggil init(frame:), bukan init?(coder aDecoder:).
Yevhen Dubinin
5
@YevhenDubinin Terima kasih, ini membantu saya. Semuanya baik-baik saja setelah saya laksanakan init(frame:)di subclass UIButton saya
doraemon
2
Ini memperbaiki masalah saya, Tapi saya harus berhenti xCode sebelum menghapus data turunan
Husam
2
init jawaban terbaik (bingkai :) adalah masalah umum
Michał Ziobro
1
Keluar dari xcode dan hapus DerivedData. Itu memecahkan masalah.
Mubashar
80

Saya memecahkan masalah dengan melakukan hal berikut:

  1. Pergi ke File > Workspace settings.
  2. Klik panah kanan kecil di sebelah "Data yang diturunkan". Ini membuka aplikasi Finder di lokasi DerivedDatafolder.
  3. Masuk ke dalam DerivedDatafolder, dan hapus folder yang sesuai dengan proyek Anda.
  4. Keluarlah dari Xcode, dan buka kembali.
  5. Bersihkan proyek Anda shiftcommandk.
  6. bangun proyek Anda commandb.
  7. Buka papan cerita Anda.
  8. Pergi ke Editor > Refresh all views.

Diperbarui

Terkadang langsung saja Editor > Refresh all viewsbekerja. Jika Refresh all viewsdinonaktifkan, keluarlah dari Xcode dan coba lagi.

mnemonic23
sumber
Terima kasih telah memposting ini. Saya melakukan penghapusan baris perintah "old school" dari data yang diturunkan, tetapi masalahnya tetap ada. Menggunakan metode Anda menyelesaikan masalah bagi saya.
Adrian
Segarkan semua tampilan untuk kemenangan bagi saya juga. Terima kasih!
Mike K.
56

Saya hanya menghapus tampilan yang gagal dan tekan perintah + Z untuk membatalkan penghapusan. Ini bekerja untuk saya.

Jika mengedit tampilan gagal nanti, kesalahan dapat terjadi lagi, lakukan di atas lagi.

Ryan. Yuen
sumber
6
Ini konyol tetapi Berhasil.
Ansari
1
Hebat !! Bekerja untuk saya
Nupur Sharma
1
Siapa tahu itu bisa menjadi jawabannya.
Berhasil
37

Saya menghadapi masalah ini di CocoaPod 1.5.0. Solusinya adalah menginstal ulang pod lagi (pod install lagi) setelah kesalahan ini muncul atau Anda dapat menggunakan CocoaPod 1.4.0 sebagai gantinya. Ini berfungsi dengan baik di 1.4.0 (setidaknya untuk saya.)

memperbarui:

Tambahkan skrip berikut di Podfile membantu saya memecahkan masalah di 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

referensi: https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911

Jerome Li
sumber
100% benar. downgrade ke 1.4.0 menyelesaikan masalah untuk saya.
ale_stro
4
Bekerja, 1,5.0 pod.
Andrey Oshev
3
itu s work for me, you should add berakhir` ke terakhir kode.
mahdi
1
Bekerja untuk saya juga. Mencoba semua saran lain tanpa hasil. Diuji dengan Pods 1.3.1
Sal
18

Menambahkan kode berikut ke @IBDesignablekelas saya berhasil.

override init(frame: CGRect) {
    super.init(frame: frame)
}
Mohammad Zaid Pathan
sumber
Ini bekerja untuk saya. Bahkan, saya menambahkan dua override untuk memperpanjang UITextView. (1) init(frame: CGRect, textContainer: NSTextContainer?), (2) init?(coder aDecoder: NSCoder). Kemudian bangun kembali dan peringatan (kesalahan) hilang. Bahkan tidak perlu membersihkan folder build.
John Pang
Terima kasih! Jawaban yang bagus)
JiosDev
13

Bagi siapa pun - seperti saya - yang tidak dapat menemukan IBDesignablesAgentCocoaTouchfile itu atau ketika mencoba 'Debug Selected Views' dari Editor mendapat kesalahan, berikut ini cara lain untuk men-debug kesalahan "Gagal membuat" itu.

Buka aplikasi 'Konsol', dari bilah sisi pilih Mac Anda saat ini (mungkin akan dipilih secara otomatis), kemudian pada bilah pencarian cari "IBSceneUpdate" dan tekan enter.

Dengan cara ini, setiap kali Anda mendapatkan kesalahan Xcode untuk IBDesignable tidak dapat melakukan render, Anda juga akan mendapatkan entri "IBSceneUpdate" baru dengan detail lebih lanjut tentang kesalahan tersebut.

Setidaknya itulah bagaimana saya bisa men-debug IBDesignablekesalahan saya !

Aplikasi konsol menampilkan kesalahan IBSceneUpdate

Stelabouras
sumber
1
Aplikasi ini adalah Konsol sebenarnya daripada Terminal hanya sebagai FYI.
Carl Upton
Tangkapan yang bagus! Sunting jawaban saya.
Stelabouras
12

Jika Anda menggunakan file xib untuk uiview khusus. Coba ini:

Ubah dari

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

Untuk:

let bundle = Bundle(for: UserView.self) 
bundle.loadNibNamed("UserView", owner: self, options: nil)
Hoàng Công Tùng
sumber
8

Cobalah untuk menonaktifkan 'Gunakan Variasi Karakter' (panel Identitas dan Jenis) untuk file xib apa pun yang mungkin Anda miliki untuk tampilan kustom yang digunakan di storyboard Anda.

LatinCoder
sumber
7

masalah saya diselesaikan dengan menghapus folder (yang terkait dengan proyek ini) dari folder data turunan. Anda dapat melakukan ini dengan mengklik File -> Project Setting -> kemudian klik tanda panah deside / Pengguna / .../Xcode/DerivedData klik folder DerivedData Anda akan melihat folder bernama proyek Anda menghapusnya. keluar dari xcode, buka proyek Anda, bersihkan proyek dengan menggunakan langkah ini Product-> clean lalu bangun proyek: Product-> Build Ini akan menyelesaikan masalah ini.

Mitu Vinci
sumber
4

Jawaban yang benar diberikan oleh @Maria :

periksa laporan kerusakan di ~/Library/Logs/DiagnosticReports

Cara alternatif :

  1. Buka Spotlight

masukkan deskripsi gambar di sini

  1. Tipe console.app

masukkan deskripsi gambar di sini

  1. Pilih Crash reports

masukkan deskripsi gambar di sini

  1. periksa satu IBDesignablesAgent-iOSdan tinjau crash log
gbk
sumber
Menggunakan Konsol itulah yang membantu saya memecahkan masalah saya. Pesan yang jauh lebih terperinci daripada yang ada di Xcode.
Andrew Moore
3

Cukup buka papan cerita Anda -> Editor -> Refresh semua tampilan. Ini bekerja untuk saya.

Anggara Siswanajaya
sumber
3

Saya mencoba membersihkan dan menjalankan proyek tidak akan menyelesaikan masalah ini.

Tapi Tutup dan buka kembali proyek itu.

Lal Krishna
sumber
2

Ketika saya debug ini saya menemukan ada beberapa kelas yang memodifikasi UI. Biasanya marquelabel yang merupakan subclass dari UILabel atau kelas subclass lainnya dari UIView dan menggambar ui pada saat run time dan bertabrakan dengan mesin Autolayout. Coba berikan lebar atau tinggi tetap untuk tampilan khusus ini. Jika tidak menyelesaikan masalah Anda, coba solusi berikut: -

Solusi 1: - Batalkan komentar #use_frameworks di dalam file pod Anda.

Solusi 2: - Coba hapus data yang diturunkan

  1. Tutup jendela Editor Xcode Anda dan keluar dari simulator ->
  2. Pergi ke Preferensi Xcode -> Lokasi ->
  3. Klik panah abu-abu kecil yang menunjukkan jalur data turunan ->
  4. Pilih proyek Anda ->
  5. Hapus semua folder di dalam ->
  6. Keluarlah dari Xcode dan buka kembali
Pisey Ashish
sumber
1
Bisakah Anda menguraikan bagaimana ini sebenarnya memecahkan masalah?
Paula Hasstenteufel
ini menyelesaikan masalah tetapi masih tidak tahu mengapa tidak menggunakan itu use_frameworks karena itu untuk proyek cepat benar
Abhishek
Podfile saya sudah menggunakan kerangka kerja, ada saran di masa lalu yang tidak memberi komentar?
mmr118
@ moni15 saya menambahkan satu solusi lagi yang mungkin. Silakan periksa.
Ashish Pisey
Membatalkan komentar #use_frameworks dalam file pod dan menghapus DerivedData bekerja untuk saya.
Jugal Desai
2

Saya memiliki masalah yang sama dan datang ke sini untuk mencoba dan mencari tahu apa yang terjadi. Saya perhatikan jawaban berperingkat teratas dan jawaban itu sendiri tidak membantu saya, karena IBDesignable tidak ada di folder log dan saya sudah mencoba semua opsi lain di sana, namun dalam komentar saya perhatikan seseorang berbicara tentang init bingkai.

Saya memutuskan untuk mencoba mengomentari ekstensi IBDesignable saya untuk UIView dan itu langsung memperbaiki masalah. Jadi, untuk memperbaiki ini, temukan ekstensi yang menyebabkan masalah dan pastikan untuk mengatur init yang diperlukan dengan membuat kelas IBDesignable dan menyediakan inisialisasi yang diperlukan sebagai berikut:

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

PENTING: ingatlah untuk menambahkan kelas baru ke item yang Anda gunakan pada yang dirancang.

Nox
sumber
1
Seperti yang dikatakan oleh dokumentasinya, jangan lupa untuk memanggil super.prepareForInterfaceBuilder () dalam implementasi Anda dari readyForInterfaceBuilder ().
Jaime S
1

Menghadapi Kesalahan yang sama: Jika mengkustomisasi UITextField dan menggunakan pembuat antarmuka, kesalahan di konsol adalah -Gunakan inisialisasi init yang tidak diimplementasikan '(frame :)' untuk kelas "CustomField"

Menambahkan penginisialisasi untuk memperbaiki kesalahan

Avinash
sumber
1

Saya menghadapi masalah ini setelah pembaruan ke versi XCode terbaru. Setelah mencoba beberapa solusi yang dijelaskan di atas, saya hanya cukup Xcode dan kemudian mematikan sistem dan menyalakannya dan itu bekerja untuk saya.

Mehsam Saeed
sumber
0

Setelah Anda melakukan perubahan yang diperlukan, ubah storyboard atau dalam kasus saya a. Xib untuk membuka di "XCode 7", simpan dan tutup. Ini hanya penghentian kesenjangan ukuran untuk mengatasi kesalahan tetapi pada akhirnya Anda harus memperbaikinya atau melakukan ini sampai Anda tidak lagi mampu.

Alberto Lopez
sumber
0

Dalam kasus saya, saya menggunakan perpustakaan yang subkelas UIView. Itu menggunakan IB_DESIGNABLE, dan tidak ada panggilan untuk [super awakeFromNib]. Setelah saya menambahkan panggilan ke metode ini, bug hilang.

Saya tidak yakin apakah fakta bahwa implementasi IB_DESIGNABLEitu berdampak dalam hal ini.

AnthoPak
sumber
Di mana Anda menambahkan kode untuk [super awakeFromNib]? Bisakah Anda membagikan kode Anda?
TheJeff
0

Ini cara termudah bagi saya: tambahkan skrip ini ke blog Anda 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

Sumber:

Solusi untuk @IBDesignable ini dapat ditemukan di sini: https://github.com/CocoaPods/CocoaPods/issues/5334

NFerocious
sumber