2009-10-19 16 views
12

Tôi bắt đầu di chuyển nhiều cấu trúc phân cấp chế độ xem của mình sang IB.Tại sao tôi không tỉnh dậyFromNib?

Tôi có một tệp nib được gọi là "AlignmentViewController.xib" trong đó tôi thiết lập phân cấp chế độ xem của mình với AlignmentViewController là chủ sở hữu tệp. Điều này hoạt động tốt.

Một trong những phương pháp tôi vẫn còn mờ là awakeFromNib. Trong đoạn mã sau của AlignmentViewController tôi thêm phương thức bổ sung duy nhất awakeFromNib. Tuy nhiên, nó KHÔNG được gọi là:

- (void)awakeFromNib { 

    NSLog(@"AlignmentViewController - awakeFromNib"); 
    [super awakeFromNib]; 

} 

- (id)initWithChromosomeName:(NSString *)chromosomeName 
       basepairStart:(NSUInteger)basepairStart 
       basepairEnd:(NSUInteger)basepairEnd { 

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil]; 

    if (nil != self) { 


     self.title   = @"Alignment"; 

     self.chromosomeName = chromosomeName; 
     self.basepairStart = basepairStart; 
     self.basepairEnd = basepairEnd; 

     self.wantsFullScreenLayout = YES; 

    } 

    return self; 
} 

Ai đó có thể làm rõ cho tôi những gì tôi đã bỏ lỡ ở đây không?

Chúc mừng, Doug

UPDATE: Sau khi đọc một số các câu trả lời tôi nhận ra tôi cần để có được để dưới cùng của cái gì đó là khá cơ bản.

Nhìn vào khởi tạo:

- (id)initWithChromosomeName:(NSString *)chromosomeName 
       basepairStart:(NSUInteger)basepairStart 
       basepairEnd:(NSUInteger)basepairEnd { 

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil]; 

Tôi nhận thấy tôi kêu gọi initWithNibName: ABC: Cái gián tiếp. Đây có phải là hành động xấu không? Tệp AlignmentViewController.xib định nghĩa cấu trúc phân cấp khung nhìn của tôi. Nhưng tôi không thực sự sử dụng initWithNibName: bundle: theo cách thông thường? Có cách nào tốt hơn để làm điều này?

+2

FWIW, UIViewController cũng cung cấp 'viewDidLoad' đặc biệt cho bất kỳ chế biến bạn cần phải làm trong điều khiển của bạn, sau khi xem đã được tải (cho dù là bằng tay hoặc từ một nib). –

+0

Có. Tôi sử dụng rộng rãi viewDidLoad. Tôi chỉ đang cố gắng chuyển nhiều cấu trúc UI sang IB và tôi cần phải xử lý awakeFromNib tại một số điểm. – dugla

+3

Việc sử dụng IB không yêu cầu sử dụng 'awakeFromNib', cũng không mâu thuẫn với việc sử dụng' viewDidLoad'. –

Trả lời

30

-awakeFromNib được gửi tới tất cả đối tượng được khởi tạo từ ngòi bút sau khi tất cả các đối tượng nib đã khởi tạo. Chủ sở hữu không phải là một trong những đối tượng đó. Nó tồn tại trước khi deserializing ngòi và có dây để ngòi sau khi tải, vì vậy nó không được gửi -awakeFromNib (trừ khi tất nhiên nó được instantiated bởi một số nib khác chính nó).

Một đầu mối ở đây là không có cách nào cả hai -initFromChromosomePair:basepairStart:basepairEnd:-awakeFromNib đều có thể được gọi. Bộ nạp nib luôn gọi -initWithCoder:, -initWithFrame: hoặc -init (các quy tắc được gửi là trong số Nib Object Life Cycle). Thực tế là bạn có một số initializer được chỉ định mạnh mẽ cho thấy rằng bạn đang tự tạo đối tượng này ở đâu đó trong mã, có nghĩa là đối tượng này không phải là "đánh thức từ nib."

+0

Cảm ơn Rob, tôi đoán tôi không rõ ràng về ngữ nghĩa của initWithNibName: bundle :. Ở những nơi khác trong mã của tôi, tôi thực sự gọi initWithChromosomeName: basepairStart: basepairEnd: mà lần lượt gọi initWithNibName: bundle: như được hiển thị ở trên. Không có phương pháp liên quan đến nib cháy do kết quả của việc sử dụng initWithNibName: bundle :? – dugla

+3

Nhiều đám cháy; chúng chỉ nhắm vào các đối tượng được bộ nạp nib khởi tạo. Chủ sở hữu của ngòi không phải là * trong * ngòi, và do đó không nhận được -awakeFromNib. -viewDidLoad được gửi đến bộ điều khiển xem, đây là nơi bạn sẽ làm những việc cần được thực hiện sau khi hoàn thành quá trình tải. Lưu ý rằng một bộ điều khiển xem có thể là một ngòi, vì vậy có thể nhận được cả hai -awakeFromNib (khi nó được tải từ nib cha) và sau đó -viewDidLoad (cho khi nib riêng của nó kết thúc tải). -awakeFromNib được gửi đến tất cả các đối tượng trong một ngòi sau khi tất cả các đối tượng trong ngòi đã được khởi tạo và IBOutlet có dây. –

+0

Bây giờ tôi nhận được nó. Cảm ơn Rob, điều đó thực sự làm rõ mọi thứ. Tôi đã xem xét thực tế là filesOwner chỉ là một proxy, không phải là thành viên của ngòi bút. Coolness. Cảm ơn một triệu Rob. – dugla

2

Dựa trên những gì bạn đã nói với chúng tôi, tôi tin rằng tôi biết vấn đề của bạn là gì. awakeFromNib được gọi khi một đối tượng được deserialized từ một tập tin nib. Ở đây bạn có một đối tượng, là chủ sở hữu, tồn tại trước khi ngòi bút được tải. Do đó, awakeFromNib sẽ không bao giờ được gửi đến số AlignmentViewController.h của bạn.

Nếu bạn cần làm điều gì đó ở đây, hãy thử sử dụng loadView để thay thế. Hoặc chỉ cần làm điều đó sau khi tải ngòi. Đó là những gì bạn đang buộc phải làm điều đó bạn muốn làm điều đó trong awakeFromNib?

+0

Cảm ơn Gordon. Chỉ cần cố gắng để có được tốt hơn inution xung quanh ngữ nghĩa và thời gian của nib mã liên quan. Tôi đang trong quá trình dựa ngày càng nhiều vào IB để xây dựng giao diện người dùng và tôi vẫn không chắc chắn về cách thế giới IB và thế giới XCode đồng bộ hóa. Vì vậy, không có nib phương pháp liên quan cháy làm gì để sử dụng của tôi của initWithNibName: bundle :? – dugla

+0

Không, đó là 'awakeFromNib' không được gọi trên bộ điều khiển của bạn, bởi vì bộ điều khiển của bạn không nằm trong ngòi bút. Nó sẽ được gọi trên tất cả các quan điểm và như vậy là trong nib. –

+1

Lưu ý rằng ở trên nơi Gordon nói "loadView", tôi tin rằng anh ấy có nghĩa là "viewDidLoad". Bạn thường không nên lộn xộn với -loadView khi giao dịch với bộ điều khiển xem dựa trên nib. –

32

Chỉ cần thêm làm rõ: -awakeFromNib được gửi tới Chủ sở hữu tệp trong Cocoa, chứ không phải Cocoa Touch.

From Apple's Docs:

...

  • Nó sẽ gửi một thông báo awakeFromNib để các đối tượng thích hợp trong tập tin nib rằng định nghĩa bộ chọn phù hợp:
    • Trong Mac OS X, thông báo này được gửi đến bất kỳ đối tượng giao diện để xác định phương pháp này. Nó cũng được gửi tới Chủ sở hữu tệp và mọi đối tượng proxy cũng xác định nó.
    • Trong hệ điều hành iPhone, thông báo này chỉ được gửi đến các đối tượng giao diện được khởi tạo bằng mã tải nib. Nó không được gửi tới Chủ sở hữu tệp, Người trả lời đầu tiên hoặc bất kỳ đối tượng proxy nào khác.