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 UIView
ke pengontrol tampilan di storyboard dan menyetel subkelasnya ke CustomView
.
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 IBInspectable
properti ini :
Dan setelah disetel, mereka juga muncul di "Atribut Waktu Proses yang Ditentukan Pengguna":
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 IBInspectable
properti, 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:
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 .m
file 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.
Ketika saya pertama kali mencoba melakukan ini, saya memahami bahwa IB_DESIGNABLE
kelas harus menjadi bagian dari UIKit
kerangka 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.m
disertakan untuk dibangun dengan CustomViews
kerangka kerja:
Sedangkan screenshot berikut menunjukkan beberapa hal:
CustomViews.framework
secara tepat dimasukkan dalam proyek utama.OtherView.m
juga disertakan sebagai sumber kompilasi, jadi meskipun ada sesuatu yang salahCustomView
,OtherView
seharusnya berfungsi, namun menghasilkan kesalahan yang identik.Main.storyboard
danLaunchScreen.xib
muncul sebagai merah. Saya tidak tahu mengapa, dan tidak tahu sedikit pun mengapaLaunchScreen.xib
harus (saya belum menyentuh file ini), meskipun saya dapat mengatakan setelah melihat proyek lain,Main.storyboard
juga muncul dengan warna merah untuk proyek-proyek itu, dan saya tidak melakukan apa pun denganIB_DESIGNABLE
atau diIBInspectable
sana.
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 IBInspectable
properti benar-benar ditampilkan seperti yang saya harapkan dari storyboard untuk menampilkannya. Saya membayangkan bahwa ini akan menjadi kasus bahkan tanpa arahan IB_DESIGNABLE
dan IBInspectable
, karena ini dibuat sebagai Atribut Waktu Proses yang Ditentukan Pengguna.
Jawaban:
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.
Saya mengklik "Segarkan Semua Tampilan" dan setelah Xcode sedikit berpikir, tiba-tiba storyboard menampilkan tampilan saya seperti yang diharapkan (menerapkan
IBInspectable
properti saya dengan benar ).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 menjadiThirdView
dan mendapatkan sesuatu yang sedikit berbeda kali ini:Mengklik "Tunjukkan" kepada saya ke peringatan:
Yang baru kali ini:
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":
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):
sumber
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.
sumber
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
sumber
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
DerivedData
dan peringatan itu hilang.sumber
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">
sumber
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:
dan
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.
sumber
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.
sumber
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
sumber
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!
Module
. Bagi saya ini kosong, dan saya mendapatkan kesalahan yang sama dengan OP. Saya menetapkanModule
ke nama proyek dan BAM saya - ini mulai bekerja setelah membangun kembali!sumber
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.
sumber
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 } }
sumber
Float
alih-alihCGFloat
dan melemparkannya