Nói chung, hệ thống phải xử lý việc khởi tạo bộ điều khiển chế độ xem bằng bảng phân cảnh. Những gì bạn muốn là duyệt qua hệ thống phân cấp viewController bằng cách lấy tham chiếu đến tham chiếu self.window.rootViewController
trái ngược với việc khởi tạo các bộ điều khiển chế độ xem, vốn đã được khởi tạo chính xác nếu bạn thiết lập bảng phân cảnh của mình đúng cách.
Vì vậy, giả sử của bạn rootViewController
là một UINavigationController và sau đó bạn muốn gửi một cái gì đó đến bộ điều khiển chế độ xem hàng đầu của nó, bạn sẽ làm như thế này trong AppDelegate's didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
Trong Swift nếu sẽ rất giống:
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
Bạn thực sự không nên khởi tạo bộ điều khiển chế độ xem bằng id bảng phân cảnh từ đại biểu ứng dụng trừ khi bạn muốn bỏ qua cách tải bảng phân cảnh thông thường và tự tải toàn bộ bảng phân cảnh. Nếu bạn đang phải khởi tạo các cảnh từ AppDelegate, rất có thể bạn đang làm sai. Ý tôi là hãy tưởng tượng bạn, vì một lý do nào đó, muốn gửi dữ liệu đến một bộ điều khiển chế độ xem theo cách xuống ngăn xếp, AppDelegate không nên đi vào ngăn bộ điều khiển chế độ xem để thiết lập dữ liệu. Đó không phải là việc của nó. Doanh nghiệp của nó là rootViewController. Hãy để rootViewController xử lý các phần tử con của chính nó! Vì vậy, nếu tôi bỏ qua quy trình tải bảng phân cảnh bình thường của hệ thống bằng cách xóa các tham chiếu đến nó trong tệp info.plist, thì tôi sẽ khởi tạo tối đa rootViewController bằng cách sử dụnginstantiateViewControllerWithIdentifier:
và có thể là gốc của nó nếu nó là một vùng chứa, như UINavigationController. Những gì bạn muốn tránh là khởi tạo bộ điều khiển chế độ xem đã được bảng phân cảnh khởi tạo. Đây là một vấn đề tôi thấy rất nhiều. Tóm lại, tôi không đồng ý với câu trả lời được chấp nhận. Nó không chính xác trừ khi các áp phích có nghĩa là xóa tải bảng phân cảnh khỏi info.plist vì bạn sẽ tải 2 bảng phân cảnh nếu không, điều này không có ý nghĩa gì. Nó có thể không phải là rò rỉ bộ nhớ bởi vì hệ thống đã khởi tạo cảnh gốc và gán nó cho cửa sổ, nhưng sau đó bạn đến và khởi tạo nó một lần nữa và gán lại. Ứng dụng của bạn đã có một khởi đầu khá tệ!