2015-01-22 17 views
8

Tôi có một lớp con của UIView được gọi là MyView mà tôi đang tạo.Sử dụng IBDesignable và preparForInterfaceBuilder với một UILabel

Trong đó có UILabel (điều này được thêm vào trong mã không có trong InterfaceBuilder vì lý do).

Tôi sau đó có một thuộc tính trên MyView được gọi là color.

Điều tôi muốn là có Trình tạo giao diện có thể chọn color và sau đó hiển thị nhãn với phông chữ được đặt thành màu đó.

Trong mã của tôi, tôi có ...

@IBDesignable class MyView: UIView { 

    private let textLabel = UILabel() 

    @IBInspectable var color: UIColor = .blackColor() { 
     didSet { 
      textLabel.textColor = color 
     } 
    } 

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

     initialSetup() 
    } 

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

     initialSetup() 
    } 

    private func initialSetup() -> Void { 
     self.backgroundColor = .clearColor() 

     textLabel.textAlignment = .Center 
     textLabel.numberOfLines = 0 

     addSubview(textLabel) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     textLabel.frame = bounds 
    } 

    // I have no idea what I'm doing here?! 
    override func prepareForInterfaceBuilder() { 
     // should I create a label specifically for here? 
     // or should I use the property textLabel? 

     textLabel.text = "Hello, world!" // setting place holder IB text? 
     textLabel.textColor = color 
     textLabel.font = .systemFontOfSize(21) 
     textLabel.textAlignment = .Center 
     textLabel.numberOfLines = 0 

     // do I need to add sub view? 
    } 

} 

IBInspectable

Trong IB tôi có thể thấy tài sản màu đó và tôi có thể thiết lập nó. Khó chịu nó có một giá trị mặc định của .clearColor() mặc dù không phải là màu tôi đặt trong mã. Có cách nào để khắc phục điều đó không?

IBDesignable

Khi tôi đặt tầm nhìn cho các InterfaceBuilder nó cho thấy tất cả các thuộc tính inspectable nhưng không được hiển thị trong giao diện thực tế.

Khi tôi chạy nó, tất cả đều hoạt động tốt. Tôi chỉ muốn có thể có được một cái gì đó làm việc (khác với drawRect) trong IB. Tôi tìm thấy một thiếu tài liệu rõ ràng mặc dù.

Edit - Cảnh báo

Tôi chỉ nhận thấy rằng tôi nhận được xây dựng lỗi/cảnh báo nói ...

cảnh báo: IB Designables: Bỏ qua người dùng định nghĩa thuộc tính thời gian chạy cho con đường quan trọng "màu "ví dụ về" UIView ". Nhấn một ngoại lệ khi cố đặt giá trị của nó: [setValue: forUndefinedKey:]: lớp này không phải là giá trị khóa mã hóa tuân thủ cho màu khóa.

Điều này có lẽ sẽ thay đổi giải pháp :)

Trả lời

2

tôi sao chép mã từ câu hỏi của bạn vào một ứng dụng mới, thêm chế độ xem và đặt thuộc tính và nó hoạt động tốt.

Lỗi bạn đang thấy cho thấy rằng tại một số thời điểm bạn đã thay đổi chế độ xem trở lại UIView đơn giản trong trình kiểm tra danh tính (các thuộc tính do người dùng xác định vẫn còn trong trường hợp đó).

enter image description here

+0

Vâng, hiện tại tôi đang nhận được "Phân đoạn lỗi: 11" khi cố gắng chạy nên không biết chuyện gì đang diễn ra. Đó có thể là nguyên nhân của việc này. Vui mừng khi biết tôi đã nhận được mã thực sự ngay. Tôi đã cài đặt Xcode 4 (lý do) ngày hôm nay vì vậy tôi tự hỏi, nếu cài đặt đã sai lầm xung quanh với trình biên dịch hoặc một cái gì đó ?! Cảm ơn mặc dù. Sẽ giữ cho dự án Swift của tôi: D – Fogmeister

+0

OMLG! Lỗi seg là vì tôi đã sử dụng '.clearColor()' trong một thuộc tính thay vì 'UIColor.clearColor()' nhưng không có lỗi hiển thị trong mã. Dù sao, tất cả đang làm việc ngay bây giờ: D Cảm ơn! – Fogmeister

1

Khi màu được thiết lập bạn cần cập nhật các tài sản textLabel như dưới đây sử dụng một didSet

@IBInspectable var color: UIColor = UIColor.blackColor() { 
    didSet { 
     textLabel.textColor = color 
    } 
} 
+0

Tôi nói thêm rằng. Nhưng tôi chỉ nhận thấy tôi cũng nhận được cảnh báo ... "Bỏ qua thuộc tính thời gian chạy do người dùng xác định cho màu của keyPath ..." Đã thêm câu hỏi này vào câu hỏi. – Fogmeister

1

Tôi đang sử dụng nhanh chóng 2.0 và trong trường hợp của tôi đã mất tích động tài sản.mã cuối cùng:

@IBInspectable dynamic var radius:CGFloat = 2.0 { 
    didSet { 
    // setNeedsDisplay() 
     layer.cornerRadius = radius 

    } 
} 

Tìm hiểu lỗi trong quá trình xây dựng cho IB Designables: http://lamb-mei.com/537/xcode-ibdesignables-ignoring-user-defined-runtime-attribute-for-key-path-bordercolor-on-instance-of-uiview-this-class-is-not-key-value-coding-compliant-for-the-key-bordercolor/

Các vấn đề liên quan