Tôi có một lớp con của UITableViewCell
. Phân lớp của tôi chứa một số UILabel
s. Tôi muốn phân lớp của tôi để khởi tạo các nhãn này cho một số cài đặt mặc định áp dụng cho mọi ô xem bảng của tôi.Tại sao initWithCoder không khởi tạo đúng mục?
Tôi đọc rằng tôi nên sử dụng initWithCoder
cho việc này. Hàm initWithCoder
của tôi đang được gọi, và tôi có thể đi qua từng dòng trong hàm của tôi và nó dường như đi qua các chuyển động. Tuy nhiên, khi tôi chạy ứng dụng của mình, tôi không thấy bất kỳ thuộc tính nào được áp dụng. Đáng chú ý nhất, phông chữ không bị thay đổi. Tôi chỉ không nghĩ rằng bất kỳ thuộc tính nào mà tôi đang sửa đổi trên các số UILabel
của tôi thực sự đang được lưu hoặc hiển thị.
Tôi đang sử dụng phân lớp này cùng với một số Storyboard
. Tôi biết những thay đổi của tôi sẽ không được phản ánh trên số Storyboard
, nhưng chúng cũng không được phản ánh khi ứng dụng chạy - mặc dù mã của tôi đang được thực thi.
Chỉnh sửa: Tôi muốn đề cập rằng trước khi cố gắng ghi đè initWithCoder
, tôi đã có một phương pháp thể hiện trong các lớp con này mà tôi sẽ chạy logic này. Tôi chỉ gọi phương thức đó bên trong cellForRowAtIndexPath
. Phương pháp này đã được làm việc, nhưng tôi nghĩ rằng nó sẽ là tiện dụng để có logic này trong phân lớp này xảy ra tự động.
Bất kỳ ý tưởng nào? Mã của tôi là dưới đây:
#import "ThreadListCell.h"
@implementation ThreadListCell
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
// adjust the font settings of the title
self.title.font = [UIFont fontWithName:@"SourceSansPro-Black" size:16];
self.title.textColor = [UIColor colorWithWhite:0.267f alpha:1.0f];
// adjust the font settings of the subtitle
self.text.font = [UIFont fontWithName:@"SourceSansPro-Light" size:14];
self.text.textColor = [UIColor colorWithWhite:0.267f alpha:0.9f];
self.text.textColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
// adjust the font settings of the location
self.location.font = [UIFont fontWithName:@"SourceSansPro-Light" size:8];
self.location.textColor = [UIColor colorWithWhite:0.267f alpha:0.9f];
// adjust the UILabel settings of the title
self.title.numberOfLines = 0;
self.title.lineBreakMode = UILineBreakModeTailTruncation;
// adjust the UILabel settings of the subtitle
self.text.numberOfLines = 0;
self.text.lineBreakMode = UILineBreakModeTailTruncation;
// adjust the UILabel settings of the location
self.location.numberOfLines = 0;
self.location.lineBreakMode = UILineBreakModeTailTruncation;
self.location.textAlignment = UITextAlignmentRight;
}
return self;
}
@end
Và tiêu đề:
#import <UIKit/UIKit.h>
@interface ThreadListCell : UITableViewCell
@property (nonatomic, weak) IBOutlet UILabel *text;
@property (nonatomic, weak) IBOutlet UILabel *title;
@property (nonatomic, weak) IBOutlet UILabel *location;
@end
Oh, ok. Thay thế 'initWithCoder' bằng' awakeFromNib' dường như hoạt động như mong đợi. Cảm ơn rất nhiều! – Ryan
Mặc dù, có vẻ như 'awakeFromNib' xảy ra trước khi tôi đặt bất kỳ thuộc tính nào của tôi trong' cellForRowAtIndexPath'. Điều này làm cho tôi nghĩ rằng có lẽ phương pháp cá thể của tôi là cách tiếp cận tốt hơn, bởi vì tôi có thể thực hiện các hoạt động thay đổi kích thước đáng tin cậy dựa trên văn bản hiện tại trong 'UILabel', v.v. – Ryan
Thứ tự nên là: initWithCoder, awakeFromNib, cellForRowAtIndexPath. Nếu bạn cần "cài đặt trước" một số giá trị toán học, bạn có thể làm điều đó trong thói quen init. Nhưng bạn không có quyền truy cập vào các cửa hàng của bạn cho đến khi ngòi được nạp. –