2009-10-16 21 views
146

Tôi luôn có một chút không rõ ràng về loại tác vụ sẽ được gán cho viewDidLoad so với viewWillAppear: trong lớp con UIViewController.Chế độ xem UIViewControllerDidLoad so với viewWillAppear: Phân công lao động phù hợp là gì?

ví dụ: Tôi đang làm một ứng dụng mà tôi có một lớp con UIViewController nhấn một máy chủ, lấy dữ liệu, cho 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 là gì trong số viewDidLoad so với viewWillAppear?

Trả lời

236

viewDidLoad là những việc bạn phải làm một lần. viewWillAppear được gọi mỗi lần xem xuất hiện. Bạn nên làm những việc mà bạn chỉ phải làm một lần trong viewDidLoad - như thiết lập các 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 lần 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 đi đến chế độ xem "Hiện đang phát".

Tuy nhiên, khi bạn tải những 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 thông tin liên lạc mạng của bạn vào viewDidLoad hoặc viewWillAppear, chúng sẽ được thực hiện trước khi người dùng nhận được lượt xem - có thể dẫn đến việc đóng băng ứng dụng của bạn ngắn. Có thể là ý tưởng hay để lần đầu tiên hiển thị cho người dùng chế độ xem không có dân số với chỉ báo hoạt động của một số loại. Khi bạn kết nối vớ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ể không thành công - ai biết được?), Bạn có thể điền chế độ xem với dữ liệu của mình. Các ví dụ tốt về cách thức này có thể được thực hiện có thể được nhìn thấy trong các khách hàng twitter khác nhau. Ví dụ: khi bạn xem trang chi tiết tác giả trong Twitterrific, chế độ xem chỉ hiển thị "Đang tải ..." cho đến khi truy vấn mạng hoàn tất.

+0

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

+5

viewDidLoad ONLY được gọi khi chế độ xem được tạo - ví dụ như sau khi lệnh gọi bộ điều khiển xem initFromNibNamed khi xem được truy cập. viewWillAppear được gọi bất cứ khi nào trình điều khiển chế độ xem của bạn không ở chế độ xem nhưng được xem - do đó khi bộ điều khiển chế độ xem của bạn được đẩy, viewWillAppear được gọi. Nếu bạn đẩy một subview khác từ đó, và người dùng trả về, viewWillAppear được gọi lại. –

+0

Cảm ơn Kendall. Yah, một vài NSLogs được đặt chiến lược giúp tôi sắp xếp. viewWillAppear/viewWillDisappear cháy trên push/pops viewcontroller. – dugla

11

Ban đầu chỉ sử dụng ViewDidLoad với tableView. Khi thử nghiệm với việc mất Wifi, bằng cách đặt thiết bị ở chế độ trên máy bay, nhận ra rằng bảng đã không làm mới với trả lại Wifi. Trong thực tế, dường như không có cách nào để làm mới tableView trên thiết bị ngay cả bằng cách nhấn nút home với chế độ nền được đặt thành YES 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 ý rằng việc sử dụng viewDidLoad cho việc định vị là một chút mạo hiểm và nên tránh vì giới hạn không được thiết lập. điều này có thể gây ra kết quả không mong muốn (tôi có nhiều vấn đề khác nhau ...)

This post 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 chỉ dùng một lần và định vị Tôi đang nghĩ đến việc sử dụng viewDidAppear với cờ, nếu có ai có đề xuất nào khác, vui lòng cho tôi biết.

+0

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

3

Tùy thuộc, Bạn có cần dữ liệu được tải mỗi thời gian bạn mở chế độ xem không? hoặc chỉ sau khi?

enter image description here

  • đỏ: Họ không đòi hỏi phải thay đổi mỗi lần. Một khi chúng được nạp, chúng sẽ tồn tại như thế nào.
  • 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 cùng 3 người dùng được đề xuất theo dõi, nó cần được tải lại mỗi lần 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ứ việc xử lý nào bạn cần phải thực hiện một lần.
viewWilLAppear: Bất kỳ quá trình xử lý nào cần phải 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 dữ liệuInputedByDeveloper thường là 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 tableViews hoặc collectionView) của bạn hoặc hầu hết dataInputedByUser thường là làm thay đổi.

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