Tôi có bộ mã sau:
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
(Đối với tham chiếu Swift, sự cố này cũng xảy ra với mã 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
}
}
}
Tôi đã thêm một UIView
bộ điều khiển chế độ xem trên bảng phân cảnh và đặt lớp con của nó thành CustomView
.
Điều này thêm hàng "Thiết kế". Nó bị kẹt khi "Đang cập nhật" và chú giải công cụ cho biết "Đang chờ mục tiêu xây dựng". Nó không bao giờ thay đổi từ trạng thái này.
Khi tôi chuyển sang phần kiểm tra thuộc tính, tôi có thể đặt các IBInspectable
thuộc tính sau:
Và sau khi được thiết lập, chúng cũng hiển thị trong "Thuộc tính thời gian chạy do người dùng xác định":
Tuy nhiên, trạng thái "Thiết kế" không bao giờ vượt quá "Đang cập nhật" với vẫn cùng chú giải công cụ (Tôi đã thử xây dựng Cmd + B vài lần, không có gì thay đổi).
Hơn nữa, khi tôi đặt các IBInspectable
thuộc tính, tôi nhận được cảnh báo cho từng thuộc tính:
IBDesignables - Bỏ qua thuộc tính thời gian chạy do người dùng xác định cho đường dẫn khóa "borderColor" trên trường hợp "UIView" ... lớp này không tuân thủ mã hóa khóa-giá trị cho khóa borderColor.
Ảnh chụp màn hình các cảnh báo được tạo:
Tôi quen thuộc với các vấn đề tuân thủ mã khóa-giá trị và nói chung biết cách giải quyết chúng ... nhưng tôi không hiểu cách giải quyết vấn đề này ở đây. Theo trình kiểm tra danh tính của chế độ xem, chế độ xem là "CustomView" (không phải là "UIView" thông thường, không có các thuộc tính này). Và nếu chế độ xem không phải là "CustomView" thì các thuộc tính có thể chỉ định này sẽ không hiển thị trong Trình kiểm tra thuộc tính, phải không? Nhưng khi Trình tạo giao diện cố gắng áp dụng các thuộc tính này cho chế độ xem, nó sẽ quay lại nghĩ rằng lớp của chế độ xem là "UIView" và không thể áp dụng các thuộc tính.
Bất kỳ giúp đỡ? Vui lòng cho tôi biết nếu tôi đã bỏ sót một số chi tiết quan trọng, nhưng đối với những gì nó đáng giá, tôi đã làm theo hướng dẫn này chính xác (khác với ObjC vs Swift). Cũng cần lưu ý rằng tôi đã làm theo hướng dẫn này chính xác trên một máy khác và nó hoạt động như một cái duyên (Tôi định thực hiện bài đăng này vào đêm qua nhưng máy tính tôi đang sử dụng khi đó không gặp sự cố này).
Dựa trên các nhận xét, người ta cho rằng có lẽ .m
tệp không được bao gồm và điều đó có thể gây ra sự cố. Tôi đã nghĩ chắc chắn mình sẽ hết cách để xảy ra trường hợp này, nhưng dù sao thì tôi cũng đã kiểm tra.
Khi lần đầu tiên tôi bắt đầu cố gắng làm điều này, tôi đã hiểu rằng các IB_DESIGNABLE
lớp học phải là một phần của một UIKit
khuôn khổ khác . Vì vậy, từ ảnh chụp màn hình đầu tiên này, bạn có thể thấy rằng tôi đã thiết lập một khung "CustomViews", có một lớp CustomView
,. Bạn cũng sẽ thấy ở đây rằng tôi cũng đã tạo một OtherView
, giống hệt với CustomView
, ngoại trừ nó không nằm trong một khuôn khổ riêng biệt. Tuy nhiên, vấn đề giống hệt nhau vẫn tồn tại trên bảng phân cảnh giữa cả hai lớp.
Ở đây chúng tôi có một ảnh chụp màn hình cho biết nó CustomView.m
được bao gồm để xây dựng với CustomViews
khung:
Trong khi đó, ảnh chụp màn hình sau chỉ ra một số điều:
CustomViews.framework
được đưa vào dự án chính một cách thích hợp.OtherView.m
cũng được bao gồm như một nguồn biên dịch, vì vậy ngay cả khi có vấn đề gì xảy raCustomView
, nóOtherView
sẽ hoạt động, tuy nhiên nó tạo ra các lỗi giống hệt nhau.Main.storyboard
vàLaunchScreen.xib
đang hiển thị dưới dạng màu đỏ. Tôi không biết tại sao và không có manh mối nhỏ nhất về lý do tại saoLaunchScreen.xib
nên (tôi chưa chạm vào tệp này), mặc dù tôi có thể nói sau khi xem xét các dự án khác,Main.storyboard
cũng hiển thị màu đỏ cho các dự án đó, và tôi không làm bất cứ điều gì vớiIB_DESIGNABLE
hoặcIBInspectable
ở đó.
Tôi đã thử và thử lại điều này vài lần. Nó hoạt động mọi lúc trên máy tính của tôi ở nhà - Tôi không thể tái tạo sự cố được mô tả trong câu hỏi này ở nhà. Tại nơi làm việc, nó không bao giờ hoạt động. Vấn đề được mô tả trong câu hỏi này xảy ra mọi lúc.
Cả hai máy tính đều là Mac Minis được mua mới trong năm nay (không phải mẫu mới, mẫu cuối năm 2012). Cả hai máy tính đang chạy OS X Yosemite 10.10. Cả hai máy tính đang chạy Xcode Phiên bản 6.1. Ở nhà, công trình là (6A1052d). Sáng nay, tôi có thể xác nhận rằng cả hai máy tính đang chạy các bản dựng Xcode giống hệt nhau.
Những người khác đã gợi ý với tôi rằng đó có thể là RAM kém. Điều đó có vẻ xa vời với tôi. Tôi đã khởi động lại dự án nhiều lần, khởi động lại máy tính nhiều lần. Đối với tôi, có vẻ như nếu có RAM kém trên một máy tính khoảng 6 tháng tuổi, thì tôi sẽ thấy các vấn đề khác và vấn đề này sẽ ít nhất quán hơn. Nhưng vấn đề chính xác này vẫn tồn tại mặc dù nhiều lần khởi động lại toàn bộ dự án từ đầu và khởi động lại hoàn toàn trên máy tính.
Cần lưu ý rằng nếu tôi thực sự biên dịch và chạy dự án này, chế độ xem tùy chỉnh với các IBInspectable
thuộc tính thực sự hiển thị như tôi mong đợi bảng phân cảnh sẽ hiển thị nó. Tuy nhiên, tôi tưởng tượng rằng đây sẽ là trường hợp ngay cả khi không có lệnh IB_DESIGNABLE
và IBInspectable
, vì chúng được tạo dưới dạng Thuộc tính thời gian chạy do người dùng xác định.