2010-02-17 14 views
24

Tôi đang cố gắng tìm ra từ tài liệu của sketchy của Apple mà phương pháp là nơi tốt nhất để khởi tạo và thêm các điều khiển Chế độ xem của tôi vào chế độ xem của trình điều khiển.Tôi có lập trình thêm SubViews trong ViewDidAppear, ViewDidLoad, ViewWillAppear, hàm tạo không?

Với winforms nó khá đơn giản, vì chúng luôn được khởi tạo bên trong InitializeDesigner, được gọi trong hàm tạo. Tôi đang cố gắng để phù hợp với độ tin cậy của mô hình này nếu có thể.

Tôi đang làm việc với UIViewControllersUITableViewControllers bên trong một UINavigationController phần lớn thời gian - nếu điều này ảnh hưởng đến tất cả.

Dưới đây là một ví dụ:

public MyController() 
{ 
    // Here? 
    AddViews(); 
} 

public override ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // Or is should it be here? 
    AddViews(); 
} 

public override ViewWillAppear(bool) 
{ 
    base.ViewWillAppear(animated); 

    // Here? 
    AddViews(); 
} 

public override ViewDidAppear(bool animated) 
{ 
    base.ViewDidLoad(animated); 

    // Or maybe here? 
    AddViews(); 
} 

void AddViews() 
{ 
    UILabel label = new UILabel(); 
    label.Text = "Test"; 
    label.Frame = new RectangleF(100,100,100,26); 
    View.AddSubView(label); 

    UIWebView webview = new UIWebView(); 
    webview .Frame = new RectangleF(100,100,100,26); 
    View.AddSubView(webview); 
} 

tôi nhận được kết quả khác nhau với một số UIControls khi tôi thêm chúng vào xem ở những nơi khác nhau. Visual lag đôi khi, khác lần xem web được ẩn ở đâu đó.

Có quy tắc chung nào để tiếp tục thêm chúng không?

+2

Xem thêm: http://stackoverflow.com/questions/573958/iphone-sdk-what-is-the-difference-between-loadview-and-viewdidload –

Trả lời

70

Nói chung, đây là những gì tôi làm:

  • viewDidLoad - Bất cứ khi nào tôi thêm điều khiển để một quan điểm cho rằng nên xuất hiện cùng nhau với quan điểm, ngay lập tức, tôi đặt nó trong viewDidLoad phương pháp. Về cơ bản, phương thức này được gọi bất cứ khi nào khung nhìn được nạp vào bộ nhớ. Vì vậy, ví dụ, nếu quan điểm của tôi là một hình thức với 3 nhãn, tôi sẽ thêm các nhãn ở đây; chế độ xem sẽ không bao giờ tồn tại nếu không có các biểu mẫu đó.

  • ViewWillAppear: Tôi sử dụng ViewWillAppear thường chỉ để cập nhật dữ liệu trên biểu mẫu. Vì vậy, đối với ví dụ trên, tôi sẽ sử dụng điều này để thực sự tải dữ liệu từ miền của tôi vào biểu mẫu. Tạo UIViews khá tốn kém, và bạn nên tránh càng nhiều càng tốt để làm điều đó trên phương thức ViewWillAppear, bởi vì khi điều này được gọi, nó có nghĩa là iPhone đã sẵn sàng để hiển thị UIView cho người dùng và bất cứ điều gì bạn làm ở đây sẽ tác động đến hiệu suất theo cách rất rõ ràng (như hoạt ảnh bị trì hoãn, v.v.).

  • viewDidAppear: Cuối cùng, tôi sử dụng viewDidAppear để bắt đầu chủ đề mới để điều đó sẽ mất nhiều thời gian để thực hiện, ví dụ như làm một cuộc gọi webservice để có được dữ liệu bổ sung cho các hình thức trên.Điều tốt là vì xem đã tồn tại và đang được hiển thị cho người dùng, bạn có thể hiển thị thông báo "Đang chờ" tốt cho người dùng trong khi bạn nhận dữ liệu.

Có các thủ thuật khác mà bạn có thể sử dụng. Cho phép nói rằng bạn muốn một UILabel "bay" vào biểu mẫu sau khi biểu mẫu được tải. Trong trường hợp đó, tôi sẽ thêm nhãn vào biểu mẫu trong ViewDidLoad nhưng với Khung bên ngoài vùng xem và sau đó trong ViewDidAppear tôi sẽ thực hiện hoạt ảnh để đưa nó trở lại chế độ xem.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn đã bị xóa rất nhiều. Tôi đã không thể thêm bất cứ điều gì với ví dụ LoadView từ câu hỏi này: http://stackoverflow.com/questions/573958/iphone-sdk-what-is-the-difference-between-loadview-and-viewdidload - do bạn đã từng sử dụng phương pháp này chưa? –

+1

Vì vậy, về cơ bản loadView là một phương pháp từ UIViewController (Sử dụng đá rosetta khi bạn đang cố gắng tìm ra những thứ này - http://tirania.org/tmp/rosetta.html). Khung công tác sẽ tự động gọi phương thức này trong bộ điều khiển để yêu cầu nó tạo chế độ xem và việc triển khai mặc định của UIViewController sau đó gọi ViewDidLoad. Mặc dù bạn có thể ghi đè phương thức này (và chắc chắn rằng bạn gọi phương thức cơ sở khi bạn làm), cá nhân, tôi thích chỉ sử dụng viewWillLoad (được gọi trước loadView) và viewDidLoad (được gọi sau). –

+0

@eduardo, tài liệu khuyên không nên gọi siêu trên loadView –

8

Hmm, tài liệu của Apple dường như khá rõ ràng, IMHO.

Nếu bạn tạo chế độ xem gốc của riêng mình (chế độ xem gốc của phân cấp chế độ xem của bộ điều khiển cụ thể này), bạn nên tạo nó trong -loadView mà không cần gọi super và đặt thuộc tính view khi hoàn tất. Nếu chế độ xem của bạn được tải từ ngòi bút, bạn không nên chạm vào -loadView.

Bạn thêm chế độ xem phụ tùy chỉnh vào chế độ xem của trình điều khiển chế độ xem hoặc sửa đổi nó trong -viewDidLoad. Thực hành được khuyến nghị là tạo UILabel và UIWebView của bạn trong -viewDidLoad và thả chúng trong -viewDidUnload, đặt tham chiếu của chúng thành nil nếu bạn cần giữ chúng trong ivars.

Lưu ý: -viewDidUnload không được dùng nữa trong iOS 6 và không được gọi nữa, vì UIViewController không còn xóa chế độ xem của nó dưới áp lực bộ nhớ.

+0

Cảm ơn tôi đã bỏ lỡ phương pháp đó. Tuy nhiên tôi vẫn cảm thấy các phương pháp tôi liệt kê cung cấp thông tin rất hạn chế khi sử dụng chúng. Ngay cả trong loadView tất cả các bạn đang nói là * 'Nếu bạn muốn thực hiện bất kỳ khởi tạo bổ sung của quan điểm của bạn, làm như vậy trong phương pháp viewDidLoad' * - khi nào bạn sẽ cần phương pháp này? –

+0

loadView là phương thức tải cấu trúc phân cấp xem từ NIB hoặc chỉ tạo UIView trống nếu không có NIB để tải. Bạn có thể muốn một khung nhìn tùy chỉnh thay vì nó, trong trường hợp này bạn ghi đè lên loadView. UITableViewController, ví dụ, ghi đè phương thức này để tạo ra một UITableView. Tôi thường thấy mình làm điều tương tự với các lớp con UIView của riêng mình. – Costique

+0

viewDidUnload không được chấp nhận –

2

chế độ xemDidLoad liên quan đến 'MEMORY' và chế độ xemWillAppear/viewDidAppear liên quan đến 'APPEARANCE'. Chế độ xem của bộ điều khiển chế độ xem (là chế độ xem gốc của chế độ xem của trình điều khiển chế độ xem) có thể xuất hiện/biến mất nhiều lần, ngay cả khi chế độ xem của bộ điều khiển đã có trong bộ nhớ.

(Khi đề cập đến chế độ xem gốc, tôi cũng có nghĩa là các bản xem trước của nó, vì chế độ xem gốc có tham chiếu đến con của nó (xem phụ), nhưng từ góc nhìn của trình điều khiển chế độ xem, nó thường chỉ biết chế độ xem gốc. các bản xem trước có thể xảy ra bình thường thông qua các cửa hàng của bộ điều khiển xem.)

Chính chế độ xem gốc CÓ THỂ được xóa khỏi bộ nhớ khi có cảnh báo bộ nhớ. Bộ điều khiển xem sẽ xác định khi nào là thời điểm tốt nhất để xóa chúng khỏi bộ nhớ.

Vì vậy, bạn thường sẽ thêm các bản xem trước trong viewDidLoad, vì việc thêm các bản xem phụ có nghĩa là thêm chúng vào bộ nhớ. NHƯNG không nếu bạn tạo tất cả các chế độ xem của bạn theo chương trình (không phải từ tệp nib). Nếu trường hợp đó xảy ra thì bạn nên ghi đè phương thức loadView và tạo chế độ xem gốc và thêm các bản xem phụ ở đó, vì vậy trong trường hợp này, bạn có thể bỏ qua viewDidLoad để thêm các bản xem phụ.