Vấn đề với phân lớp UITextView (và UICollectionView) là hàm tạo được chỉ định là "initWithFrame". Nhưng trong cuộc sống thực, khi nó tải từ bảng phân cảnh, initWithCoder sẽ được gọi.Swift: Phân lớp UITextView hoặc UICollectionView và khởi tạo thích hợp
class BorderedTextView: UITextView {
//will be called
init(coder: NSCoder?){
//constant values here is not an option
super.init(frame: CGRectMake(0,0,100,100), textContainer: nil)
}
//will not be called
init(frame: CGRect, textContainer: NSTextContainer!) {
super.init(frame: frame, textContainer: textContainer)
}
}
Kết quả là tôi không thể gọi bất kỳ mã tùy chỉnh giao diện người dùng nào trên init và cung cấp bất kỳ giá trị khởi tạo nào cho biến Swift ngoại trừ các giá trị mặc định.
Tôi cho rằng vấn đề có thể được giải quyết tạm thời bằng cách trích xuất kích thước khung hình từ "coder", nhưng tôi không tìm thấy chìa khóa cho nó.
Bất kỳ ý tưởng nào tốt hơn giá trị khung hardcode?
Tôi hy vọng rằng 'super.init (coder: coder)' hoạt động - và cho các lớp con của UIView hoặc UILabel nó (ít nhất trình biên dịch không phàn nàn). Nhưng đối với các lớp con của 'UITextView', nó không thành công với thông báo lỗi" Phải gọi initializer được chỉ định ... ". Một lỗi Swift? –
Cách giải quyết có thể là thực hiện khởi tạo trong 'awakeFromNib' thay thế. –
Bạn nói đúng, có vẻ như nó hoạt động cho UIView (tôi đã cập nhật câu hỏi). Nhưng tôi cũng có cùng một vấn đề với UICollectionView, do đó, vấn đề không chỉ với UITextView. –