2012-03-05 38 views
18

Tôi nghĩ rằng tôi không bao giờ nên gọi [super loadView] nhưng có điều gì đó khiến tôi khó hiểu.Có ổn không khi gọi [super loadView]?

Trong mô tả của loadView (UIViewController Class Reference) người ta nói rằng "thực hiện tùy chỉnh của bạn của phương pháp này không nên gọi siêu.", nhưng trong ZoomingPDFViewer ví dụ mà họ đưa ra, thực hiện loadView (ZoomingPDFViewerViewController) đang gọi [siêu loadView].

Tôi đã cố gắng gọi nó từ phương thức loadView của tôi và nó hoạt động ok, nhưng tôi chỉ không hiểu sau đó có nghĩa là gì để không gọi siêu.

Trả lời

25

Bạn chắc chắn không nên gọi số [super loadView]. Tôi muốn nói bạn đã tìm thấy một lỗi trong ví dụ ZoomingPDFViewer.

Bạn ghi đè loadView khi bạn muốn tạo lập trình phân cấp chế độ xem cho trình điều khiển chế độ xem của bạn một cách có lập trình (không sử dụng xib).

Như bạn đã chỉ ra, các tài liệu rõ ràng tuyên bố rằng bạn không nên gọi siêu.

Triển khai tùy chỉnh phương pháp này của bạn không được gọi là siêu.

Tôi giả định này là để tránh bốc cả hai từ một xib và programatically tạo một cái nhìn như phương pháp này được sử dụng bởi các cơ sở để tải một cái nhìn từ một xib:

Nếu bộ điều khiển xem có tệp nib liên kết, phương thức này tải chế độ xem từ tệp nib.

Cũng lưu ý rằng ngay cả nếu trong quá trình phân bổ các đối tượng UIViewController của bạn, bạn vượt qua con số không cho tham số nibNameOrNil rằng việc thực hiện UIViewController của loadView sẽ cố gắng để tải bất kỳ xib với tên lớp liên quan trong đó.

Một bộ điều khiển xem có tập tin nib liên quan nếu tài sản nibName trả về một giá trị không bằng không, mà xảy ra nếu bộ điều khiển xem được instantiated từ một kịch bản, nếu bạn một cách rõ ràng được gán cho nó một tập tin nib sử dụng initWithNibName: bundle: method, hoặc nếu iOS tìm thấy tệp nib trong gói ứng dụng có tên dựa trên tên lớp của bộ điều khiển xem . Nếu bộ điều khiển chế độ xem không có tệp nib được liên kết, phương pháp này sẽ tạo đối tượng UIView đơn giản thay thế.

Mục đích thực sự của phương pháp này là để cung cấp cho bạn kiểm soát toàn bộ việc xây dựng hệ thống phân cấp xem mà không dựa vào việc xây dựng trong cơ chế xib tải .:

Bạn có thể ghi đè phương pháp này nhằm tạo của bạn lượt xem theo cách thủ công.

Cá nhân, tôi ghi đè loadView nếu: 1.) Các xib tôi sẽ làm cho nó thực sự tầm thường hoặc 2.) Việc bố trí các điều khiển là rất năng động, vì vậy tạo ra một xib với một bố trí tĩnh có chút lợi ích .

+1

+1 đánh dấu cho chiều dài cùng với rõ ràng/ngắn gọn ... – Damo

0

Nếu bạn không có chế độ xem được tạo trong IB, bạn nên gọi [super loadView] trong mã của bạn để cung cấp chế độ xem cho chương trình của bạn.

Trong trường hợp chế độ xem tùy chỉnh, bạn giả sử tạo chế độ xem với công cụ xây dựng liên kết, vì vậy bạn không cần phải gọi nó.

+0

Ok, nhưng điều đó có nghĩa là "Việc triển khai tùy chỉnh phương pháp này của bạn không nên gọi là siêu". – Aleksa

+1

nó có nghĩa là bạn đang tạo chế độ xem, vì vậy bạn không cần phải tải siêu dữ liệu của mình xuống –

+1

Bạn cung cấp chế độ xem cho chương trình của mình bằng cách thực hiện một cái gì đó như: 'UIView * myView = [[[UIView alloc] init] autorelease]; ... (tạo cấu trúc phân cấp khung nhìn) ... self.view = myView; 'Nếu bạn không gán' self.view' cho một giá trị mới, thì điểm quan trọng của 'loadView' là gì? – Sam

1

NSViewController cố gắng khởi tạo chế độ xem từ một nib trong -loadView. Vì tên nib của bạn không được đặt cho bộ điều khiển của bạn, nó sẽ chỉ cho bạn self.view = nil; Tôi sẽ giả định UIViewController hoạt động theo cùng một cách.

Vì vậy, nó phải an toàn, nhưng bạn hoàn toàn không cần thiết.

+3

Trong khi nó vô hại, nếu có một xib với tên dựa trên tên bộ điều khiển xem, sau đó gọi '[super loadView]' sẽ tải nib đó vào ' self.view'. Tôi chưa bao giờ thực sự thấy điều này xảy ra (kể từ khi tôi không bao giờ gọi siêu), nhưng dựa trên các tài liệu đó là những gì tôi mong đợi. Ngoài ra, tôi nghĩ việc gọi '[super loadView]' sẽ tối thiểu gán một khung nhìn chung cho 'self.view', đó là những gì mã của bạn nên làm. Một lần nữa điều này sẽ không làm tổn thương bất cứ điều gì (giả sử việc thực hiện tùy chỉnh 'loadView' gán giá trị cho' self.view' sau khi gọi super), nhưng nó là lãng phí. – Sam

0

Nếu bạn tạo ViewController theo lập trình, bạn có thể gọi super.loadView() thay vì self.view = UIView(frame: UIScreen.main.bounds) vào đầu override func loadView() để xây dựng chế độ xem của bạn. Tuy nhiên, bạn không nên gọi super.loadView() và tạo tùy chỉnh UIViewController.view cùng một lúc. Chỉ cần không thích một robot để giải thích tài liệu của Apple.

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