2012-08-13 32 views
19

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 

Trả lời

45

Không ai trong số IBOutlets của bạn được thiết lập khi bạn nhận được thông báo - bạn cần phải sử dụng "awakeFromNib" hoặc "viewDidLoad" - một cái gì đó như thế - để truy cập các cửa hàng của bạn. Điều đó nói rằng, bạn có thể thiết lập các công cụ không xuất hiện khác trong initWithCoder.

+1

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

+0

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

+3

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. –

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