IB_DESIGNABLE, IBInspectable - Pembuat antarmuka tidak memperbarui

91

Saya memiliki set kode berikut:

CustomView.h

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface CustomView : UIView

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

@end

CustomView.m

#import "CustomView.h"

@implementation CustomView

- (void)setBorderColor:(UIColor *)borderColor {
    _borderColor = borderColor;
    self.layer.borderColor = borderColor.CGColor;
}

- (void)setBorderWidth:(CGFloat)borderWidth {
    _borderWidth = borderWidth;
    self.layer.borderWidth = borderWidth;
}

- (void)setCornerRadius:(CGFloat)cornerRadius {
    _cornerRadius = cornerRadius;
    self.layer.cornerRadius = cornerRadius;
}

@end

(Untuk referensi Swift, masalah ini juga terjadi dengan kode Swift)

CustomView.swift

@IBDesignable
class CustomView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

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

    @IBInspectable var borderColor : UIColor = UIColor.clearColor() {
        didSet {
            self.layer.borderColor = borderColor.CGColor
        }
    }

    @IBInspectable var borderWidth : CGFloat = 0.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius : CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }
}

Saya menambahkan UIViewke pengontrol tampilan di storyboard dan menyetel subkelasnya ke CustomView.

masukkan deskripsi gambar di sini

Ini menambahkan baris "Designable". Itu macet di "Memperbarui" dan tooltip mengatakan "Menunggu Target untuk Dibangun". Itu tidak pernah berubah dari status ini.

Ketika saya pindah ke atribut inspect, saya dapat mengatur IBInspectableproperti ini :

masukkan deskripsi gambar di sini

Dan setelah disetel, mereka juga muncul di "Atribut Waktu Proses yang Ditentukan Pengguna":

masukkan deskripsi gambar di sini

Namun, status "Designables" tidak pernah bergerak melampaui "Updating" dengan tooltip yang masih sama (saya sudah mencoba membangun Cmd + B beberapa kali, tidak ada yang berubah).

Selain itu, saat saya menyetel IBInspectableproperti, saya mendapatkan peringatan untuk masing-masing properti:

IBDesignables - Mengabaikan atribut runtime yang ditentukan pengguna untuk jalur kunci "borderColor" pada instance "UIView" ... kelas ini tidak sesuai dengan kode nilai kunci untuk key borderColor.

Tangkapan layar dari peringatan yang dihasilkan:

masukkan deskripsi gambar di sini


Saya terbiasa dengan masalah kepatuhan pengkodean nilai kunci dan umumnya tahu cara menyelesaikannya ... tetapi saya tidak mengerti cara menyelesaikan masalah ini di sini. Menurut pemeriksa identitas tampilan, tampilan tersebut adalah "CustomView" (bukan "UIView" biasa, yang tidak memiliki properti ini). Dan jika tampilan bukan "CustomView", maka properti yang dapat didesain ini tidak akan muncul di Attributes Inspector, bukan? Tapi ketika Interface Builder mencoba menerapkan atribut ini ke tampilan, itu kembali ke pemikiran kelas tampilan adalah "UIView" dan tidak dapat menerapkan atribut.

Ada bantuan? Tolong beri tahu saya jika saya telah meninggalkan beberapa detail penting, tetapi untuk apa nilainya, saya mengikuti tutorial ini dengan tepat (selain ObjC vs Swift). Perlu juga dicatat bahwa saya mengikuti tutorial ini tepat di komputer lain dan bekerja seperti pesona (saya bermaksud membuat posting ini tadi malam tetapi komputer yang saya gunakan saat itu tidak mengalami masalah ini).


Berdasarkan komentar, telah disarankan bahwa mungkin .mfile tersebut tidak disertakan dan itu mungkin menyebabkan masalah. Saya pikir pasti saya akan keluar dari jalan saya agar skenario ini menjadi kasusnya, tetapi saya tetap memeriksanya.

masukkan deskripsi gambar di sini

Ketika saya pertama kali mencoba melakukan ini, saya memahami bahwa IB_DESIGNABLEkelas harus menjadi bagian dari UIKitkerangka kerja yang berbeda . Jadi dari screenshot pertama ini, Anda dapat melihat bahwa saya menyiapkan kerangka "CustomView", yang memiliki satu kelas CustomView,. Anda juga akan melihat di sini bahwa saya juga membuat OtherView, yang identik dengan CustomView, kecuali itu tidak dalam kerangka terpisah. Masalah serupa tetap ada di papan cerita antara kedua kelas.

Di sini kami memiliki tangkapan layar yang menunjukkan yang CustomView.mdisertakan untuk dibangun dengan CustomViewskerangka kerja:

masukkan deskripsi gambar di sini

Sedangkan screenshot berikut menunjukkan beberapa hal:

  • CustomViews.framework secara tepat dimasukkan dalam proyek utama.
  • OtherView.mjuga disertakan sebagai sumber kompilasi, jadi meskipun ada sesuatu yang salah CustomView, OtherViewseharusnya berfungsi, namun menghasilkan kesalahan yang identik.
  • Main.storyboarddan LaunchScreen.xibmuncul sebagai merah. Saya tidak tahu mengapa, dan tidak tahu sedikit pun mengapa LaunchScreen.xibharus (saya belum menyentuh file ini), meskipun saya dapat mengatakan setelah melihat proyek lain, Main.storyboardjuga muncul dengan warna merah untuk proyek-proyek itu, dan saya tidak melakukan apa pun dengan IB_DESIGNABLEatau di IBInspectablesana.

masukkan deskripsi gambar di sini


Saya telah mencoba dan mencoba lagi ini beberapa kali sekarang. Ia bekerja setiap kali di komputer saya di rumah - Saya tidak dapat mereproduksi masalah yang dijelaskan dalam pertanyaan ini di rumah. Di tempat kerja, itu tidak pernah berhasil. Masalah yang dijelaskan dalam pertanyaan ini terjadi setiap saat.

Kedua komputer tersebut baru dibeli Mac Minis tahun ini (bukan model baru, model akhir 2012). Kedua komputer menjalankan OS X Yosemite 10.10. Kedua komputer menjalankan Xcode Versi 6.1. Di rumah, build adalah (6A1052d). Pagi ini, saya dapat mengonfirmasi bahwa kedua komputer menjalankan versi Xcode yang identik.

Orang lain menyarankan kepada saya bahwa itu mungkin RAM yang buruk. Itu tampaknya terlalu mengada-ada bagi saya. Saya telah memulai ulang proyek beberapa kali, memulai ulang komputer beberapa kali. Menurut saya jika ada RAM yang buruk pada komputer yang berumur sekitar 6 bulan, saya akan melihat masalah lain, dan masalah ini akan kurang konsisten. Tetapi masalah sebenarnya ini tetap ada meskipun beberapa kali memulai ulang seluruh proyek dari awal dan memulai ulang sepenuhnya di komputer.


Perlu dicatat bahwa jika saya benar-benar mengkompilasi dan menjalankan proyek ini, tampilan kustom dengan IBInspectableproperti benar-benar ditampilkan seperti yang saya harapkan dari storyboard untuk menampilkannya. Saya membayangkan bahwa ini akan menjadi kasus bahkan tanpa arahan IB_DESIGNABLEdan IBInspectable, karena ini dibuat sebagai Atribut Waktu Proses yang Ditentukan Pengguna.

nhgrif
sumber
Yah, itu hanya sebuah ide. Saya menghapus CustomView.m dari target dan kemudian mendapat peringatan serupa saat menjalankan aplikasi.
Martin R
Itu tampak seperti gremlin nyata mengingat perbandingan Anda dengan mesin yang tampaknya identik (yang entah bagaimana berbeda). Sudahkah Anda mencoba memposting ke devforums? Sepertinya Anda terbang buta tanpa informasi tambahan, dan proses Anda tampak masuk akal dan rasional. Peringatan "build" mungkin tidak terlalu berarti karena Xcode dipenuhi dengan pesan error yang menyesatkan. Untuk iseng, Anda telah mencoba Editor -> "debug tampilan yang dipilih", bukan? (Mungkin tidak akan berhasil, tapi patut diperiksa kewarasannya). Selain itu, apakah ada yang muncul di aplikasi Konsol (logging)?
Chris Conover
Saya mengalami masalah yang sama. Tambang dengan satu file xib berisi IB_DESIGNABLE. Namun memeriksa pengaturan saya, saya sudah mengaktifkan penyegaran otomatis dan sekarang saya mencoba menyegarkan manual, menghapus data yang diturunkan terlebih dahulu, dll. Sejauh ini tidak ada yang berhasil. Hal yang aneh adalah bahwa saya memiliki kontrol ini berfungsi dengan baik, lalu berhenti. Dan saya tidak berpikir saya mengubah kode apa pun di antaranya. Gila.
drekka
Menunjukkan peringatan seperti di atas. Sekarang telah membuat kelas kedua dengan kode yang disalin dari IB asli yang dapat dirancang. Kelas ini bekerja dengan sempurna dan ketika saya beralih kembali ke kelas non-pekerja yang asli, sekarang bekerja dengan baik. Dari sini saya telah menyimpulkan bahwa ada beberapa cache di suatu tempat (bukan dalam data turunan) yang tidak dibersihkan sampai ib yang asli dapat ditukar dengan ib yang dapat dirancang lain. Mengubah ke UIView sepertinya tidak menghapus cache ini. Hanya ib yang bisa didesain. Pergi gambar :-)
drekka

Jawaban:

75

Berdasarkan saran chrisco untuk men-debug tampilan yang dipilih (yang telah saya lakukan, tetapi mencoba lagi untuk ukuran yang baik), saya melihat beberapa opsi lain di bagian bawah menu Editor.

  • Segarkan Tampilan Secara Otomatis
  • Segarkan Semua Tampilan

Saya mengklik "Segarkan Semua Tampilan" dan setelah Xcode sedikit berpikir, tiba-tiba storyboard menampilkan tampilan saya seperti yang diharapkan (menerapkan IBInspectableproperti saya dengan benar ).

masukkan deskripsi gambar di sini

Saya kemudian menjalani seluruh proses lagi untuk memastikan bahwa ini adalah solusinya.

Saya membuat kelas baru ThirdView,. Kelas ini identik lagi dengan yang lain. Saya mengubah kelas pandangan saya menjadi ThirdViewdan mendapatkan sesuatu yang sedikit berbeda kali ini:

masukkan deskripsi gambar di sini

Mengklik "Tunjukkan" kepada saya ke peringatan:

masukkan deskripsi gambar di sini

Yang baru kali ini:

Menggunakan kelas UIView untuk objek dengan kelas kustom karena kelas ThirdView tidak ada.

Ini sebenarnya tidak lebih membantu dari apa yang sudah ada. Ditambah, sekarang tiga peringatan lainnya telah berlipat ganda menjadi 6 secara aneh.

Bagaimanapun, jika saya mengklik "Segarkan Semua Tampilan" dari menu tarik-turun Editor lagi, semua kesalahan akan hilang, dan sekali lagi, tampilan ditampilkan dengan benar.

Tetap saja, sampai saat ini, semua yang saya lakukan adalah hal-hal yang tidak pernah saya mainkan di rumah. Di rumah, itu berhasil. Jadi saya mengaktifkan "Automatically Refresh Views" dan membuat "FourthView" untuk diuji - sekali lagi, identik dengan tiga yang pertama.

Setelah mengubah kelas tampilan menjadi "FourthView", label yang dapat didesain bertuliskan "Memperbarui" untuk beberapa saat, lalu akhirnya berkata "Diperbarui":

masukkan deskripsi gambar di sini

Jadi, saya memeriksa komputer saya di rumah. "Automatically Refresh Views" diaktifkan di komputer yang selalu berfungsi. Itu dimatikan di komputer yang tidak. Saya tidak pernah ingat menyentuh opsi menu ini. Saya bahkan tidak dapat memberi tahu Anda dengan pasti apakah itu ada sebelum Xcode 6. Tetapi opsi inilah yang membuat perbedaan.


TL; DR, jika Anda mengalami masalah yang sama dengan yang dijelaskan dalam pertanyaan, pastikan "Refresh Tampilan Secara Otomatis" diaktifkan (atau secara manual "Segarkan Semua Tampilan" saat Anda memerlukan pembaruan di IB):

masukkan deskripsi gambar di sini

nhgrif
sumber
2
Saya sebenarnya sedang mencari cara mematikannya karena terus rendering di latar belakang membuat MacBook lama sangat lambat. Terima kasih!
Departamento B
Ini mungkin menyelesaikan sementara, tapi lihat jawaban dari @ Martin-Gilles Lavoie
Ashley Mills
22

Saya memiliki beberapa detail lebih lanjut yang dapat menyebabkan kelas IBD Anda tidak dapat dimuat.

Pilih storyboard / xib bermasalah Anda di mana tampilan kustom Anda harus ditampilkan.

Di area navigator, buka Report Navigator di ruang kerja / proyek XCode Anda.

Di menu Editor XCode, tekan (seperti yang disebutkan oleh nhgrif), opsi "Segarkan Semua Tampilan". Ini akan menyebabkan IB meluncurkan kompilasi untuk sejumlah besar hal yang saya yakin tidak akan Anda duga.

Di Report Navigator, Klik "By Group" untuk memfilter konten dan lihat bagian "Interface Builder". Anda akan melihat bahwa demi memuat kerangka kerja tampilan IBD yang dapat didesain khusus, itu akan mengkompilasi BANYAK hal. Jika salah satu dari target ini TIDAK dikompilasi, seperti (mungkin tidak berlaku lagi) target pengujian unit (meskipun mereka sama sekali tidak terkait dengan kode yang memuat tampilan atau storyboard ini), maka IB akan gagal memuat dll Anda.

Dalam kasus saya, IB mencoba mengumpulkan 8 target, termasuk 4 target di mana pengujian unit yang belum diperbarui sejak perubahan refactoring baru-baru ini kami kerjakan.

Sebagian besar perubahan / perbaikan kode yang telah saya lakukan agar IB memuat dan menampilkan tampilan bea cukai saya dengan benar di mana tidak terkait atau bahkan ditautkan dengan kelas-kelas ini, juga tidak akan pernah memuat storyboard selama menjalankan pengujian unit ini. Namun, IB memiliki ketergantungan pada keseluruhan kompilasi ruang kerja agar dapat berfungsi.

Martin-Gilles Lavoie
sumber
Hai, jadi bagaimana cara menghentikan IB untuk mencoba memuat dan menampilkan tampilan yang tidak terkait atau ditautkan ke kelas ini?
HannahCarney
Saya berasumsi itu ada hubungannya dengan dependensi header. Apakah kelas yang dapat dirancang menyentuh kelas lain, saat header terlihat, itu akan membangun implementasi terkait tersebut. Apple sedang bermain-main dengan kode grafik ketergantungan sumber di XC7GM yang benar-benar gagal pada proyek kami dengan XCode macet saat membangun grafik. 7.1betas berikut tidak menunjukkan masalah tersebut. Untuk saat ini, sistem build otomatis kami masih bergantung pada 6.4, jadi kami belum menyelidiki cara menyelesaikannya lebih lanjut di bawah XC6.4. Kami akan langsung beralih ke 7.1GM.
Martin-Gilles Lavoie
Jika Anda memiliki banyak target / proyek maka ini adalah jawaban yang benar-benar tepat dan benar-benar memperbaiki masalah - SEMUA target harus dibangun dengan rapi, saya bahkan tidak tahu ada bagian "Pembuat Antarmuka" di navigator laporan! Semua jawaban lain yang saya lihat pada dasarnya adalah banyak lambaian tangan yang mungkin memperbaikinya untuk sementara, tetapi ini adalah solusi yang pasti. Sudah selesai dilakukan dengan baik.
Ashley Mills
3
Jadi, menurut ini, kita dapat menyimpulkan bahwa atribut IB_DESIGNABLE adalah omong kosong dan membuang waktu. Hindari menggunakannya.
m8labs
IB_DESIGNABLE tidak ada hubungannya dengan masalah dan solusi yang tercantum di atas. Ini hanyalah tanda NO-OP bagi IB untuk melihat hal-hal yang dapat digunakan. Anda hanya perlu menjaga kebersihan rumah.
Martin-Gilles Lavoie
22

Hanya petunjuk singkat bagi orang lain yang mengalami masalah ini: ingatlah untuk menentukan jenis variabel.

// Doesn't show up in IB
@IBInspectable var includeLeftSection = true

// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true
GoldenJoe
sumber
6

Saya mendapat peringatan yang sama Ignoring user defined runtime attribute for key path ..meskipun saya benar-benar yakin saya tidak melakukan kesalahan apa pun dengan kelas tampilan IBD yang dapat dirancang khusus.

Ternyata, dalam kasus saya, ini berkaitan dengan cache Xcode.

rm -rf ~/Library/Developer/Xcode/DerivedData/*

Bersihkan DerivedDatadan peringatan itu hilang.

samwize
sumber
1
Pintasan di XCode untuk mencapai hasil yang sama: ⌘⇧K
Mojo66
@ Mojo66 Saya yakin Clean Build berbeda dengan membersihkan folder DerivedData. Tentu saja, terkadang build bersih cukup baik untuk menyelesaikan masalah cache Xcode tertentu.
samwize
@ Mojo66 Anda mungkin bermaksud K (cmd + alt + shift + K)
tzaloga
5

Jika ada orang lain yang melawan kesalahan kelas IB Designables tidak ada, karena alasan yang sama seperti yang saya lakukan. Jawaban teratas bukanlah masalah saya ... tapi ini masalah yang sedikit terkait ...

Ada properti tersembunyi dalam kode sumber papan cerita yang disebut customModule.

Misalnya saya memiliki kelas bernama ForwardArrow di dalam kerangka terpisah yang secara tidak sengaja saya tambahkan ke target utama saya.

Jadi XML untuk beberapa tampilan berakhir sebagai customClass = "ForwardArrow" customModule = "MainTargetNameWasHere"

Ketika saya menghapusnya dari target utama dalam build story board tidak memperbarui MainTargetNameWasHere ke CustomViews yang merupakan kerangka kerja tempatnya berada dan mulai memberikan bahwa kelas tidak ditemukan kesalahan.

Jadi TLDR; Pastikan jika IBDesignable Anda berada dalam kerangka lain, atribut customModule xml di papan cerita Anda disetel ke nilai yang benar. Dan jika tidak ada sama sekali tambahkan.

Contoh dari sumber saya:

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">
Dave Thomas
sumber
1
Sialan, ini membuatku gila selama sehari. Benar-benar serangga kecil yang jahat.
GoldenJoe
5

Sebagai contoh saya, saya menggunakan CheckboxButton melalui pod dan grafik kotak centang tidak pernah muncul di storyboard sementara saya mendapatkan masalah yang sama yang dijelaskan dalam pertanyaan di sini:

peringatan: IB Designables: Menggunakan kelas UIView untuk objek dengan kelas kustom karena kelas CheckboxButton tidak ada

dan

peringatan: IB Designables: Mengabaikan atribut runtime yang ditentukan pengguna untuk jalur kunci "checkColor" pada instance "UIView". Klik pengecualian saat mencoba menyetel nilainya: [setValue: forUndefinedKey:]: kelas ini tidak sesuai dengan kode nilai kunci untuk kunci checkColor.

Cara memecahkan masalah saya adalah dengan menyediakan modul dengan nama CheckboxButton seperti di bawah ini:

Catatan: Anda harus mengganti CheckboxButton dengan nama modul apa pun yang Anda gunakan.

Bahkan Cheng
sumber
4

Saya pribadi memecahkan masalah ini dengan menggunakan tombol "-" untuk menghapus konten dari inspektur identitas saya. Saat Anda menghapus kelas kustom, mengubah konten di IB, lalu menambahkan kelas kustom baru, elemen yang dapat didesain di inspektur identitas tidak dihapus dan itu menyebabkan saya mengalami kesalahan itu. Hapus saja semuanya dan bangun kembali.masukkan deskripsi gambar di sini

HannahCarney
sumber
Saya melakukan persis seperti yang Anda katakan dan itu memecahkan masalah saya. Semua solusi sebelumnya yang terungkap di sini tidak berhasil. Terima kasih banyak. ; o)
XLE_22
@ XLE_22 terkadang jawaban tidak ada yang melihat yang memecahkannya, eh? :)
HannahCarney
Saya mengalami masalah saat saya mengganti nama properti IBInspectable di beberapa xib saya. Setelah melakukan itu saya mendapat banyak peringatan yang memberi tahu saya bahwa XCode tidak dapat menemukan properti yang sekarang diganti namanya. Menghapus properti dari inspektur identitas memperbaiki masalah saya.
WBuck
1

Saya tahu ini terjawab, tapi ini satu pengalaman lagi.

Saya mengalami beberapa masalah yang tidak terkait dengan masalah ini, tetapi dalam prosesnya saya menghapus @IBInspectable dari vars di kelas saya dan menghapus atribut dari inspektur identitas (alt-apple-3).

Setelah memperbaiki masalah (kode) dengan komponen, saya menyegarkan semuanya berkali-kali, tetapi masih tidak ada atribut di inspektur identitas.

Akhirnya, saya perhatikan bahwa mereka kembali, tetapi hanya di inspektur atribut (alt-apple-4) . Begitu saya menambahkan nilai kepada mereka di sana, mereka muncul kembali di inspektur identitas

Gordon Dove
sumber
1

Jawaban Dave Thomas di atas memberi saya solusi (kebalikan) ketika bukan yang lain (Derived Data, Editor> Refresh) yang melakukannya, tetapi demi kejelasan jika orang tidak yakin di mana harus mengedit XML ... Anda tidak ' tidak perlu!

  1. Di file storyboard Anda, pilih tampilan yang merepotkan
  2. Di sidebar kanan, pilih tab Identity Inspector (opsi ke-3 dari kiri).
  3. Anda akan memiliki kelas khusus Anda, yang seharusnya sudah disetel, dan Module. Bagi saya ini kosong, dan saya mendapatkan kesalahan yang sama dengan OP. Saya menetapkan Moduleke nama proyek dan BAM saya - ini mulai bekerja setelah membangun kembali!
whycodewhyyyy
sumber
0

Saya baru saja membahas masalah ini. Saya mencoba semua hal yang tercantum di sini dan di tempat lain tanpa hasil. Ini adalah storyboard yang berfungsi dengan baik selamanya dan tiba-tiba berhenti bekerja dengan masalah "Mengabaikan atribut runtime yang ditentukan pengguna ...".

Untuk alasan apa pun, menghapus kode ini dari salah satu IBDesignable saya memperbaikinya:

-(void)viewDidLoad {
    self.clipsToBounds = YES;
}

menghapus ini menyebabkan semua peringatan hilang, bahkan di objek IBDesignable lainnya. Saya tidak tahu mengapa langkah yang satu ini memperbaikinya, tetapi mungkin itu akan membantu orang lain juga.

IMFletcher
sumber
3
Anda melewatkan panggilan untuk makan malam di sini
RolandasR
0

Saya mengalami masalah yang sama dan saya harus mengubah cornerRadius dan BorderWidth menjadi String dan kemudian mentransmisikannya ke CGFloat, itu adalah satu-satunya solusi bagi saya untuk dapat mengubah nilai dan melihat perubahan dalam pembuat antarmuka.

@IBInspectable var borderColor: UIColor? {
    didSet {
        layer.borderColor = borderColor!.CGColor
    }
}

@IBInspectable var borderWidth: String? {
    didSet {
        layer.borderWidth = CGFloat(Int(borderWidth!) ?? 0)
    }
}

@IBInspectable var cornerRadius: String? {
    didSet {
        layer.cornerRadius = CGFloat(Int(cornerRadius!) ?? 0)
        layer.masksToBounds = layer.cornerRadius > 0
    }
}
Chuy47
sumber
Saya pikir IBInspectable hanya dapat melakukan jenis tertentu, jadi mungkin Anda perlu menggunakan Floatalih-alih CGFloatdan melemparkannya
Fonix