Chế độ xem UIViewControllDidLoad so với viewWillAppear: Phân công lao động hợp lý là gì?


164

Tôi luôn luôn không rõ ràng về loại nhiệm vụ nên được gán cho viewDidLoadvs viewWillAppear.: trong một UIViewControllerlớp con.

ví dụ: tôi đang làm một ứng dụng trong đó tôi có một UIViewControllerlớp con đánh vào một máy chủ, lấy dữ liệu, đưa nó vào một khung nhìn và sau đó hiển thị khung nhìn đó. Những ưu và nhược điểm của việc này trong viewDidLoadso với là viewWillAppeargì?

Câu trả lời:


251

viewDidLoad là những việc bạn phải làm một lần. viewWillAppear được gọi mỗi khi khung nhìn xuất hiện. Bạn nên làm những việc mà bạn chỉ phải thực hiện một lần trong viewDidLoad - như đặt văn bản UILabel của bạn. Tuy nhiên, bạn có thể muốn sửa đổi một phần cụ thể của chế độ xem mỗi khi người dùng xem nó, ví dụ: ứng dụng iPod cuộn lời bài hát trở lại đầu mỗi khi bạn chuyển đến chế độ xem "Đang phát".

Tuy nhiên, khi bạn đang tải mọi thứ từ máy chủ, bạn cũng phải suy nghĩ về độ trễ. Nếu bạn đóng gói tất cả các giao tiếp mạng của bạn vào viewDidLoad hoặc viewWillAppear, chúng sẽ được thực thi trước khi người dùng nhìn thấy chế độ xem - có thể dẫn đến đóng băng ứng dụng của bạn. Nó có thể là ý tưởng tốt để lần đầu tiên hiển thị cho người dùng một chế độ xem không phổ biến với một chỉ báo hoạt động nào đó. Khi bạn hoàn thành việc kết nối mạng của mình, có thể mất một hoặc hai giây (hoặc thậm chí có thể thất bại - ai biết được?), Bạn có thể điền vào chế độ xem với dữ liệu của mình. Các ví dụ tốt về cách điều này có thể được thực hiện có thể được nhìn thấy trong các ứng dụng khách twitter khác nhau. Ví dụ: khi bạn xem trang chi tiết về tác giả trong Twitterrific, chế độ xem chỉ nói "Đang tải ..." cho đến khi các truy vấn mạng hoàn tất.


Vì vậy, liên quan đến viewWillAppear có khả năng được gọi nhiều lần. Liệu phương thức đó có kích hoạt nếu, ví dụ, khung nhìn của trình điều khiển khung nhìn hiển thị sau khi bị ẩn (ý tôi là ở đây, không phải là phương thức ẩn trên UIView). Trong những gì scenerio sẽ xemWillAppear sẽ được gọi mà không bị bắt trước bởi một cuộc gọi đến viewDidLoad?
dugla

7
viewDidLoad CHỈ được gọi khi chế độ xem được xây dựng - vì vậy, ví dụ sau khi một trình điều khiển xem initFromNibNamed cuộc gọi khi chế độ xem được truy cập. viewWillAppear được gọi bất cứ lúc nào bộ điều khiển xem của bạn không hiển thị nhưng xuất hiện trong chế độ xem - vì vậy khi trình điều khiển xem của bạn được đẩy, viewWillAppear sẽ được gọi. Nếu bạn đẩy một lượt xem khác từ đó và người dùng quay lại, viewWillAppear sẽ được gọi lại.
Kendall Helmstetter Gelner

Cảm ơn Kendall. Yah, một vài NSLogs được đặt một cách chiến lược đã giúp tôi sắp xếp. viewWillAppear / viewWillDissappear bắn vào đẩy / bật điều khiển khung nhìn.
dugla

3
Lưu ý rằng viewDidLoad cũng sẽ được gọi nếu chế độ xem bị ẩn và sau đó được tải vì lý do liên quan đến bộ nhớ, sau đó xuất hiện lại. Những gì bạn có thể tin cậy: viewDidLoad sẽ được gọi là AT LEAST ONCE khi chế độ xem được tạo lần đầu tiên và KHẢ NĂNG nhiều lần hơn khi chế độ xem xuất hiện lại sau khi bị ẩn. viewWillAppear sẽ LUÔN được gọi khi chế độ xem sắp xuất hiện trên màn hình.
DanM

2
Ai đó có thể vui lòng nhận xét thêm về hai câu hỏi liên quan này không: (1) Đôi khi, không phải lúc nào, giá trị khung cho các điều khiển (nghĩa là nguồn gốc và kích thước) bằng 0 trong viewDidLoad và đôi khi không - Tại sao? (2) Trong mẫu của Apple dành cho splitViewControll's detailView (iPad), có một phương thức configureView - những gì nên có trong đó so với viewDidLoad và ViewWillAppear?
Jeff

12

Ban đầu chỉ sử dụng ViewDidLoad với tableView. Khi thử nghiệm mất Wifi, bằng cách đặt thiết bị ở chế độ máy bay, nhận ra rằng bảng không được làm mới khi trả lại Wifi. Trên thực tế, dường như không có cách nào để làm mới bảng Xem trên thiết bị ngay cả khi nhấn nút home với chế độ nền được đặt thành CÓ trong -Info.plist.

Giải pháp của tôi:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

10

Điều quan trọng cần lưu ý là việc sử dụng viewDidLoad để định vị là một chút rủi ro và nên tránh vì giới hạn không được đặt. điều này có thể gây ra kết quả không mong muốn (tôi có nhiều vấn đề ...)

Bài đăng này mô tả khá tốt các phương pháp khác nhau và những gì xảy ra trong mỗi phương pháp.

hiện tại cho init và định vị một lần Tôi đang nghĩ đến việc sử dụng viewDidAppear với một cờ, nếu có ai có bất kỳ đề xuất nào khác xin vui lòng cho tôi biết.


đồng ý với điều này: "... nên tránh vì giới hạn không được đặt ..."
danisupr4

4

Tùy thuộc, Bạn có cần tải dữ liệu mỗi khi bạn mở chế độ xem không? hay chỉ một lần ?

nhập mô tả hình ảnh ở đây

  • Màu đỏ: Họ không cần phải thay đổi mỗi lần. Một khi chúng được tải, chúng vẫn như cũ.
  • Màu tím: Chúng cần thay đổi theo thời gian hoặc sau khi bạn tải mỗi lần. Bạn không muốn thấy 3 người dùng được đề xuất theo dõi, nó cần được tải lại mỗi khi bạn quay lại màn hình. Ảnh của họ có thể được cập nhật ... bạn không muốn xem ảnh từ 5 năm trước ...

viewDidLoad:Bất cứ xử lý nào bạn có mà cần phải được thực hiện một lần.
viewWilLAppear:Bất cứ xử lý nào cần thay đổi mỗi khi trang được tải.

Nhãn, biểu tượng, tiêu đề nút hoặc hầu hết dataInputedByDeveloper thường không thay đổi. Tên, ảnh, liên kết, trạng thái nút, danh sách (Mảng đầu vào cho bảngView hoặc bộ sưu tập của bạn) hoặc hầu hết dataInputedByUser thường thay đổi.


Màu tím sẽ được gọi trong viewDidAppear chứ không phải viewWillAppear
Alex Kornhauser

@AlexKornhauser ý bạn là nó sẽ được gọi là gì? Tôi đang nói rằng viewWillAppearbạn có thể truy vấn và kiểm tra các tweet mới nhất. viewDidAppearquá muộn cho việc đó
Honey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.