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.