@IBDesain yang salah: IB Designables: Gagal memperbarui status tata letak otomatis: Alat Pembuat Antarmuka Cocoa Touch terjatuh

157

Saya memiliki subkelas yang sangat sederhana dari UITextView yang menambahkan fungsionalitas "Placeholder" yang dapat Anda temukan asli pada objek Bidang Teks. Ini kode saya untuk subclass:

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

Setelah mengubah kelas untuk UITextViewobjek di Inspektur Identitas PlaceholderTextView, saya dapat mengatur Placeholderproperti baik-baik saja di Inspektur Atribut. Kode berfungsi dengan baik saat menjalankan aplikasi, tetapi tidak menampilkan teks placeholder di pembangun antarmuka. Saya juga mendapatkan kesalahan non-pemblokiran berikut (saya berasumsi inilah sebabnya tidak dirender pada waktu desain):

kesalahan: IB Designables: Gagal memperbarui status tata letak otomatis: Antarmuka Alat Pembuat Cocoa Touch jatuh

kesalahan: IB Designables: Gagal merender instance PlaceholderTextView: Merender tampilan membutuhkan waktu lebih dari 200 ms. Kode gambar Anda mungkin mengalami kinerja yang lambat.

Saya tidak dapat menemukan apa yang menyebabkan kesalahan ini. Kesalahan kedua tidak masuk akal, karena saya bahkan tidak mengungguli drawRect (). Ada ide?

Albert Bori
sumber
1
Saya mendapatkan kesalahan ini. Objek bekerja dengan baik di proyek uji, tetapi tidak di proyek utama saya (dalam tabel). Menurut developer.apple.com/library/mac/recipes/… , saya memilih Choose Editor> Debug Selected Views. Lalu saya mendapat "Tidak dapat men-debug tampilan" "Pastikan kerangka kerja Anda memiliki pengaturan bangunan yang benar untuk bangunan untuk iOS." Tidak ada yang muncul di Google untuk kesalahan ini.
Matt

Jawaban:

238

Ada laporan kerusakan yang dihasilkan saat Alat Pembuat Cocoa Touch Antarmuka macet. Tesis ini terletak di ~/Library/Logs/DiagnosticReportsdan dinamai IBDesignablesAgentCocoaTouch_*.crash. Dalam kasus saya, mereka berisi tumpukan-jejak berguna yang mengidentifikasi masalah dalam kode saya.

Petter
sumber
1
Terima kasih! Ini sangat membantu! Di mana Anda menemukan info tentang laporan kerusakan? :)
Ben-G
57
Dalam kasus saya, saya menemukan itu initFrame(frame: CGRect)harus didefinisikan. Lakukan jika Anda memberikan initmetode sendiri .
Travis
Ini adalah solusi terbaik. Saya tidak mengimplementasikan initWithFrame di salah satu tampilan.
HotFudgeSunday
3
Saya menggunakan laporan diagnostik dan seperti @Travis disebutkan, saya perlu menimpa init(frame: CGRect)secara eksplisit karena saya punya inimetode khusus . Anda mungkin ingin melihat laporan kerusakan use of unimplemented initializer 'init(frame:)'langsung Application Specific Informationdi bawah dalam laporan. Terima kasih kawan! Gandakan menang dalam jawaban ini!
Chris
4
Seperti biasa, file log ini juga tersedia di aplikasi Konsol macOS, di bawah grup Laporan Diagnostik Pengguna .
Paulo Mattos
51

Saya memiliki masalah yang sama beberapa kali. Kedua kali itu dimulai ketika saya memuat nib IBDesignable ke storyboard ketika nib tidak dapat masuk pada tampilan (yaitu saya memiliki tombol dari UIView tetapi masih di nib). Setelah saya memperbaiki Xcode itu masih memberi saya kesalahan jadi saya me-restart Xcode sampai secara acak berhenti memberi saya kesalahan.

Saya harap ini membantu.

UPDATE: Saya baru saja membunuh semua proses yang bernama "Interface Builder Cocoa Touch Tool", restart Xcode dan kesalahan hilang. Tidak tahu apakah ini akan selalu berhasil atau tidak.

Dustin Williams
sumber
2
Meskipun saya masih tidak mengerti mengapa, Jika Anda tidak menimpa initmetode apa pun , kode yang diposting sebagai bagian dari pertanyaan tidak lagi menunjukkan IB Designableskesalahan dan placeholder ditampilkan dengan benar di Interface Builder.
Willington Vega
2
Mungkin ini adalah bug dan kita hanya perlu menunggu untuk diperbaiki. Mungkin di Xcode 6.3.
Youssef Moawad
3
XCode 7.1.1 dan masih ada. Restart XCode tidak menyelesaikan masalah. Saya harus secara manual membunuh semua proses yang disebut Interface Builder Cocoa Touch Tool, kemudian XCode macet, memulai kembali dan mulai bekerja.
Cristian Pena
1
Poin penting: Memang PERTAMA membunuh proses pembangun antarmuka, kemudian hentikan XCode - jika Anda melakukannya sebaliknya masalah tetap ada ...
TheEye
2
XCode 8.1 kesalahan ini masih terjadi. Awalnya disebabkan oleh tidak memiliki init override tetapi bertahan setelah init ditambahkan. Harus membunuh proses Interface Builder seperti yang dijelaskan THEN restart xcode sebagai @TheEye mengatakan
John Fowler
39

Dalam kasus saya, saya melakukan yang berikutnya dalam metode initWithFrame / initWithCoder untuk membuat tampilan:

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

Sepertinya saya tidak seharusnya menggunakan Bundel Utama , tetapi sebaliknya bundel kelas. Jadi saya mengganti kode itu untuk yang berikut dan berhasil:

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

Saya pikir mungkin ini bisa membantu seseorang.

Jmoukel
sumber
1
Ini memperbaiki masalah saya juga! @Jmoukel terima kasih!
edopelawi
Yang itu memperbaiki masalah saya. Pria!!! saya tidak dapat melihat bahwa "bundleForClass" baris walaupun saya melihat ke solusi ini beberapa kali. :(
elk_cloner
let bundle = Bundle(for: ValidatingTextField.self)dalam bahasa Swift
Cfr
14

Anda bisa memilih tampilan kustom Anda di Interface Builder dan penggunaan kemudian Editor, Debug Selected Views. Ini akan meluncurkan apa yang disebut IBDesignableAgentCocoaTouchsesi debug ketika semua breakpoints (termasuk breakpoints pengecualian) bekerja dan Anda bisa mengidentifikasi secara tepat tempat crash view Anda.

Fyodor Volchyok
sumber
Sempurna! Ini juga menemukan masalah saya - font yang salah. Yang menjelaskan mengapa hanya satu dari enam IBDesignables yang sangat mirip gagal.
zkarj
13

Untuk Xcode 8 - Swift

Menambahkan nilai opsional sebagai nilai default pada @IBInspectablepenyebab masalah bagi saya.

Ini tidak akan berfungsi:

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

Ini seharusnya bekerja:

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

class func getDefaultImage() -> UIImage {
    if let defaultImage = UIImage(named: "myImage") {
        return defaultImage
    } else {
        return UIImage()
    }
}
Mohammad Zaid Pathan
sumber
@TungTran Masalah apa yang Anda hadapi?
Mohammad Zaid Pathan
1
Penanganan opsional mencegah kecelakaan. Tetapi tahukah Anda apa yang menyebabkan UIImage (bernama :) mengembalikan nihil secara konsisten?
ScottyBlades
Mengomentari kode ini memperbaikinya untuk saya `@objc @ tersedia (*, tidak digunakan lagi, diganti nama:" backgroundColor ") @IBInspectable public var signatureBackgroundColor: UIColor = .white {didSet {backgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper
9

Saya mengalami masalah Interface Builder yang sama yang menghasilkan desain.

Menggunakan teknik yang disarankan dalam jawaban ini saya bisa melacak masalah dengan penggunaan literal gambar.

Rendering macet

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

Tidak ada rendering mogok

self.backgroundImage.image =  UIImage(named: "rectangleCenter")
Nick Cross
sumber
Anda seorang pahlawan.
nathangitter
Adakah gagasan mengapa literal gambar tidak kompatibel dengan IB? Saya memiliki masalah yang sama.
SwiftsNamesake
6

Sebenarnya jika Anda memiliki beberapa atribut yang ditetapkan pengguna lama (yang tidak berlaku untuk tampilan saat ini) di tampilan apa pun di storyboard Anda, yang dapat menyebabkan agen Anda mogok.

Selain itu, kadang-kadang itu terjadi hanya karena bug Xcode yang tidak menyenangkan. Untuk memeriksanya, ketika Anda berada di storyboard hapus centang Editor> Secara Otomatis Refresh Tampilan, kemudian pindah ke file lain, bersihkan dan mulai ulang proyek Anda. Setelah memasukkan papan cerita lagi, Anda dapat mengklik Editor> Segarkan Tampilan dan periksa satu lagi otomatis. Yang itu juga memecahkan masalah saya sekali.

Jika keduanya tidak berhasil, maka mungkin Anda telah melakukan kesalahan tentang tampilan IBDesignable Anda, jadi pilih tampilan yang macet di storyboard dan debug dengan mengklik Editor> Debug Views

Yusuf Kamil AK
sumber
Anda adalah hadiah dari Tuhan.
andrewcar
4

Ini tidak berlaku untuk pertanyaan ini, tetapi mungkin saya akan membantu orang lain.

Saya memiliki masalah yang sama ketika di kelas @IBDesignable saya, saya tidak mengimplementasikan keduanya:

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

    // custom setup
}

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

    // custom setup
}
tzaloga
sumber
Anda harus selalu menerapkan kedua metode init. Init with frame digunakan ketika Anda init melihat dari kode dan init dengan aDecoder digunakan dari InterfaceBuilder.
Skodik.o
4

Saya memiliki masalah yang sama dan saya menyelesaikannya dengan menambahkan 'use_frameworks!' ke Podfile proyek saya.

Semoga ini bisa membantu Anda.

Jimmy Ng
sumber
Ini bekerja untuk saya ketika saya memiliki masalah ini dengan JVFloatLabeledTextField
saswanb
Ini yang berhasil bagi saya, mengadopsi proyek Obj-C lama yang sudah ketinggalan zaman. IB menyala seperti pohon Natal setelah ini! Terima kasih.
menggambar ..
3

Dalam kasus saya itu entah bagaimana terkait dengan kerangka carthage yang saya gunakan. Saya harus menambahkan $ (PROJECT_DIR) / Carthage / Build / iOS ke pengaturan build Runpath Search Paths

AkademiksQc
sumber
Setelah mencoba semua solusi yang diposting ... ini adalah satu-satunya perbaikan yang bekerja untuk saya! Terima kasih!
Joel
3

Dalam kasus saya, itu adalah masalah dengan OneSignal. Rupanya, mereka memiliki bug dalam versi 2.2.0 ke atas. Beralih ke 2.1.6 dan semuanya hebat lagi!

Lihat ini .

Paul Razvan Berg
sumber
1

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 pada Xcode Anda dan keluar dari simulator -> 2. Buka Preferensi Xcode -> Lokasi -> 3. Klik panah abu-abu kecil yang menunjukkan jalur data yang diturunkan -> 4. Pilih proyek Anda -> 5. Hapus semua folder di dalam -> 6. Keluar dari Xcode dan buka kembali

Pisey Ashish
sumber
1

Tambahkan ke bagian bawah Podfile Anda dan jalankan 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
Tissa
sumber
1

Tambahkan skrip ini di bagian akhir saya Podfiledan tampil pod installlagi.

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
Haroldo Gondim
sumber
1

Masalah utama adalah ketika Anda membuat @ IBDesignable, pastikan file cocoapod tidak termasuk dalam UITests atau hal itu akan menyebabkan kerusakan ini.

Modesto Cabrera
sumber
0

Saya menemukan alasannya adalah ukuran xib Anda tidak sama dengan desain di storyboard. Pastikan xib memiliki tinggi dan lebar yang sama.

pengguna6476366
sumber
0

Saya baru saja melewatkan baris kode ini platform :ios, '7.0' dan masalah terpecahkan. Hanya baris ini di file pod Anda dan perbarui masalah pod Anda akan teratasi.

Shahzaib Maqbool
sumber
0

Bagi saya itu adalah sertifikat penandatanganan yang hilang, karena saya tidak pernah menjalankan aplikasi, jadi Xcode belum membuat sertifikat. Setelah saya menjalankan aplikasi, IBDesignablerendering bekerja dengan baik.

Florian Pfisterer
sumber
0

Ini seperti jika Anda mendapat Kode dari Pengembang lain dan Anda mendapatkan kesalahan ini. Lari saja

pod install

Ini berhasil untuk saya. Semoga ini bisa membantu.

Dhruv Khatri
sumber
0

Pastikan Anda tidak langsung menginisialisasi UIImageatauUIFont menggunakan aset atau font yang ditambahkan dalam proyek Anda.

Saya selalu membuat private func setUp()di kelas @IBDesignablekhusus saya UI. yang disebut dari init(frame: CGRect), init?(coder aDecoder: NSCoder). Jadi saya akhirnya memperbarui setup()sebagai berikut.

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
}
Sauvik Dolui
sumber
-1

Biarkan saja untuk membangun dan menjalankan di simulator jika Anda memiliki kesalahan di tempat lain dalam proyek hanya berkomentar dan jalankan yang dirancang terlebih dahulu untuk memperbarui yang dirancang dan menghapus tanda komentar pada kode lain. Ini bekerja untuk saya.

Daniel
sumber