2010-07-02 34 views
12

Tôi phải đối mặt với một tình huống kỳ lạ. Trong bộ điều khiển của tôi, viewDidLoad đang gọi trước init. Có lý do kỹ thuật nào đằng sau điều đó không?viewDidLoad gọi trước init?

Trả lời

0

Không, thông báo viewDidLoad luôn được gọi là sau init.

Bạn có chắc chắn init được gọi là không? Có một số phương pháp init đặc biệt là cho UIViewController, có thể một số khác được gọi thay vì làm cho bạn suy nghĩ khác nhau.

Nếu bạn cần thêm thông tin, vui lòng dán mã của chế độ xemDidLoad và tất cả các phương thức init của bạn và cho chúng tôi biết cách nó được tải (tức là với mã) hoặc từ một ngòi bút.

+1

Có, init đang gọi nhưng sau khi viewDidLoad. Cho rằng UIViewController cụ thể chỉ phân bổ và init. và thiết lập bộ điều khiển đó cho UITabBarController như một bộ điều khiển xem và trình bày tabbarController? Có điều gì sai ở đây không? –

+0

Init chạy trước viewDidLoad, trừ khi bạn sai lầm thực sự thực sự xấu mà rất khó xảy ra. Bạn đang thiếu một init khác hoặc rút ra kết luận sai. Điều gì khiến bạn nghĩ rằng init được gọi sau khi viewDidLoad? Và bạn đã kiểm tra điều này là cùng một đối tượng? Một lần nữa, không có mã - không có cách nào để kiểm tra. – Eiko

0

Nếu ViewController của bạn đang được tải từ tệp nib chính của bạn, thì rất có thể đó là initWithCoder đang được gọi để khởi tạo bộ điều khiển.

3

Khi bạn khởi tạo mã UIViewController từ mã, bạn sử dụng -initWithNibName:bundle:, trong khi khi được khởi tạo từ XIB, mã tải XIB sẽ gọi -initWithCoder:. Một, và chỉ một trong hai phương pháp này sẽ được gọi, và chúng chắc chắn sẽ được gọi trước -viewDidLoad.

Không có cách nào có thể hiểu được rằng -viewDidLoad có thể được gọi trước, trừ khi bạn tự gọi nó (bạn không bao giờ nên thực sự làm).

11

Tôi biết đây là một bài đăng cũ, nhưng tôi sẽ đăng quan điểm của mình ở bất kỳ đâu vì tôi nghĩ rằng nó có thể giúp ai đó.

Vâng, tôi đã ở trong tình huống tương tự này. Tôi nghĩ rằng viewDidLoad đã được gọi trước phương thức init trong lớp điều khiển khung nhìn của tôi. Nhưng những gì đã thực sự xảy ra không phải là: luồng bắt đầu trên phương thức init, nhưng nhảy tới viewDidLoad khi gọi [super init *], vì vậy các thông điệp tường trình của tôi trong phương thức viewDidLoad đã được hiển thị đầu tiên là các phương thức khởi tạo tùy chỉnh của tôi.

Tôi nghĩ là vậy. Tôi hy vọng điều này để tiết kiệm thời gian cho một ai đó.

[Xin lỗi vì tiếng Anh của tôi]

+0

Quan sát tuyệt vời! –

34

Phương pháp viewDidLoad đang được gọi là khi truy cập vào self.view bên trong phương pháp init (kể từ self.view nên chưa được nạp từ ngòi quá trình này dường như được buộc chặt để nó không trở lại không).

+4

Cảm ơn bạn. self.view trong init là vấn đề lớn của tôi. –

+1

Cảm ơn, đã chuyển mọi hoạt động self.view thành viewDidLoad và thay đổi tất cả các thuộc tính mà tôi cần trong trình khởi tạo được chỉ định của tôi từ self.property thành _property. Giải quyết mọi thứ. – Jonauz

+0

Nhận xét muộn, tôi gặp phải vấn đề tương tự, nhưng tôi bị nhầm lẫn như thế nào? Nó chỉ bỏ qua các nhà xây dựng? –

3

Tôi không biết loại ViewController nào đã gây ra lỗi này cho bạn nhưng tôi đã gặp phải trường hợp tương tự với UITabBarController. Tôi nghĩ rằng nó có thể giúp một số khác đối mặt với nó với UITabBarController.
Như tôi biết tất cả các viewControllers gọi init trước viewDidLoad, ngoại trừ UITabBarController và các lớp con của nó.
Như Andrew tuyên bố here, UITabBarControllers gọi loadView bên trong phương thức [super init], gây ra lệnh gọi viewDidLoad. Vì vậy, phương thức viewDidLoad sẽ được gọi trước khi init kết thúc.
Nếu bạn có một số thứ để thiết lập trong viewDidLoad, bạn có lẽ nên làm điều đó bên trong phương thức init sau khi gọi tới [super init].

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