2011-06-22 50 views
12

Tôi muốn hiểu tại sao nếu tôi cố gắng đặt giá trị (I.e. setAlphaValue hoặc setTitle) cho một đối tượng (như NSButton) trong phương thức init không có gì xảy ra, nhưng nếu tôi gọi hàm setter trong awakeFromNib nó hoạt động chính xác.init and awakeFromNib

@interface appController : NSObject { 
    NSButton *btn; 
} 
@end; 

@implementation appController 
-(void)awakeFromNib { 
    //it works 
    [btn setTitle:@"My title"]; 
} 

-(id)init { 
    self = [super init]; 
    if(self){ 
     //it doesn't works 
     [btn setTitle:@"My title"]; 
    } 
} 
@end 
+0

là nút của bạn một IBOutlet? – Eimantas

Trả lời

37

Outlets được thiết lập sau-inittrước-awakeFromNib. Nếu bạn muốn truy cập các cửa hàng, bạn cần phải thực hiện điều đó trong -awakeFromNib hoặc phương pháp khác được thực hiện sau khi các cửa hàng được đặt (ví dụ: -[NSWindowController windowDidLoad]).

Khi một tập tin nib được nạp:

  1. Các đối tượng trong tập tin nib được phân bổ/khởi tạo, nhận hoặc -init, -initWithFrame:, hoặc -initWithCoder:
  2. Tất cả các kết nối được tái lập. Điều này bao gồm hành động, cửa hàng và ràng buộc.
  3. -awakeFromNib được gửi tới các đối tượng giao diện, chủ sở hữu tệp và đối tượng proxy.

Bạn có thể đọc thêm về quy trình tải nib trong Resource Programming Guide.

+1

+1 để trở nên nhanh hơn và lâu hơn. :) – Eiko

+0

Cảm ơn bạn! Câu trả lời hoàn hảo (tôi cần chờ thêm vài phút để chấp nhận nó :)) – MatterGoal

+3

Tôi muốn thêm điều này: "Thứ tự mà mã nib-loading gọi phương thức awakeFromNib của đối tượng không được bảo đảm. Trong OS X, Cocoa cố gắng Gọi phương thức awakeFromNib của File's Owner cuối cùng nhưng không đảm bảo hành vi đó.Nếu bạn cần cấu hình các đối tượng trong file nib của bạn thêm vào thời gian tải, thời gian thích hợp nhất để thực hiện điều đó là sau khi cuộc gọi nib-loading của bạn trả về. , tất cả các đối tượng được tạo, khởi tạo và sẵn sàng để sử dụng. " từ Hướng dẫn lập trình tài nguyên trong câu trả lời này. –

5

Khi ở chế độ init, chế độ xem sẽ không được thiết lập chính xác và các cửa hàng không được kết nối. Đó là lý do tại sao bạn sử dụng awakeFromNib: trong trường hợp này - mọi thứ được thiết lập và sẵn sàng để sử dụng.