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
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.
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.
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).
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]
Quan sát tuyệt vời! –
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).
Cảm ơn bạn. self.view trong init là vấn đề lớn của tôi. –
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
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? –
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]
.
- 1. Khi nào viewDidLoad được gọi?
- 2. iPhone: Những gì được gọi sau khi viewDidLoad trước khi viewWillAppear?
- 3. `[super viewDidLoad]` convention
- 4. -viewDidLoad không được gọi trong UIViewController lớp con
- 5. UIRefreshControl trên viewDidLoad
- 6. viewWillAppear vs Viewdidload ios
- 7. Phiên bản chỉ kết thúc trước của Init hook?
- 8. Đường bay Maven init trước khi di chuyển
- 9. UIViewController viewDidLoad chiều rộng/chiều cao không chính xác
- 10. Phương thức HttpModule Init được gọi nhiều lần - tại sao?
- 11. iOS5: Lẫn lộn với loadview và init và biến mẫu
- 12. Sự khác nhau giữa didFinishLaunchingWithOption và viewDidLoad
- 13. Lỗi kéo được jQuery-UI 'không thể gọi phương thức trước init', khi cập nhật lên phiên bản 1.10.1
- 14. Phân lớp dict: nên dict .__ init __() được gọi?
- 15. gọi init cho nhiều lớp cha với siêu?
- 16. không thể cập nhật view.layer.frame trong viewDidLoad?
- 17. Tại sao viewDidUnload được gọi là ít thường xuyên hơn viewDidLoad?
- 18. Sự khác nhau giữa window.onload = init(); và window.onload = init;
- 19. UIViewController.View.Window là null trong phương pháp viewDidLoad
- 20. init and awakeFromNib
- 21. UIViewController (init và initWithNibName)
- 22. bố trí subview khác nhau trong viewDidLoad và viewWillAppear
- 23. Gọi lại dojo trước AJAX
- 24. Tại sao không thực hiệnSegueWithIdentifier làm việc bên trong viewDidLoad?
- 25. Tôi có nên gọi [super superMethod] sau mã của riêng tôi hoặc trước mã không?
- 26. undefined tham chiếu đến `std :: ios_base :: Init :: Init() '
- 27. Sử dụng `tự = [tự init]` quấn khác 'init message`
- 28. MKMapView và viewDidLoad/viewWillAppear/viewDidAppear sử dụng Storyboards
- 29. Cần thiết để gọi empty() trước html() hoặc trước innerHTML?
- 30. định hướng thiết bị iphone hiện tại trong ViewDidLoad
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? –
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