Tham chiếu đến các biến phiên bản AppDelegate


84

Tôi có một dự án dựa trên mẫu Ứng dụng Dựa trên Điều hướng. Trong AppDelegate là các phương thức -applicationDidFinishLoading:-applicationWillTerminate:. Trong các phương pháp đó, tôi đang tải và lưu dữ liệu ứng dụng, đồng thời lưu trữ nó trong một biến thể hiện (nó thực sự là một biểu đồ đối tượng).

Khi ứng dụng tải, nó sẽ tải MainWindow.xib, có một NavigationConroller, đến lượt nó lại có RootViewController. nibNameThuộc tính RootViewController trỏ đến RootView (lớp điều khiển thực tế của tôi).

Trong lớp của tôi, tôi muốn tham chiếu đến đối tượng mà tôi đã tạo trong -applicationDidFinishLoading:phương thức, để tôi có thể tham chiếu đến nó.

Bất cứ ai có thể cho tôi biết làm thế nào để làm điều đó? Tôi biết cách tham chiếu giữa các đối tượng mà tôi đã tạo theo chương trình, nhưng dường như tôi không thể tìm ra cách quay ngược lại, vì bước giữa đã được thực hiện từ trong tệp NIB.

Câu trả lời:


204

Đối với các biến (thường là cấu trúc dữ liệu mô hình) mà tôi cần truy cập nó ở bất kỳ đâu trong ứng dụng, hãy khai báo chúng trong lớp AppDelegate của bạn. Khi bạn cần tham khảo nó:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 

7
Tôi đã bình chọn cái này vì bạn đã thêm diễn viên, bạn cần truyền AppDelegate cho loại của riêng mình để bạn có thể thấy các thuộc tính của riêng mình mà bạn đặt. Bạn có thể chỉnh sửa để làm cho điều này rõ ràng hơn bằng cách không đúc để "appdelegate" mặc dù ...
Kendall Helmstetter Gelner

Có cách nào để truy cập bộ điều khiển chế độ xem gốc mà không cần tham chiếu đến tên đại biểu ứng dụng hoặc bất kỳ thành viên nào của nó không? (Tôi muốn viết một số mã di động cần bộ điều khiển chế độ xem gốc.)
SK9

SK9, mọi ứng dụng iOS đều phải có appDelegate, vì vậy mã sẽ có tính di động!
Daniel

16

Nếu tôi hiểu câu hỏi của bạn, bạn có muốn tham chiếu đến các biến / thuộc tính thành viên trong đối tượng AppDelegate của mình không? Cách đơn giản nhất là sử dụng đại biểu [[UIApplication sharedApplication]] để trả về một tham chiếu đến đối tượng của bạn.

Nếu bạn có thuộc tính gọi là window, bạn có thể thực hiện điều này:

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow

11

Đây là một giải pháp thay thế di động được xác định rõ ràng cho iOS4.0 trở lên:

UIApplication *myApplication = [UIApplication sharedApplication];
UIWindow *mainWindow = [myApplication keyWindow];
UIViewController *rootViewController = [mainWindow rootViewController];

hoặc, trong một dòng,

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

Đừng quên thiết lập thuộc tính của cửa sổ rootViewController(nói trong IB) hoặc điều này sẽ làm jack.


2

Xác định macro và sử dụng nó ở bất cứ đâu!

#define appDelegateShared ((AppDelegate *)[UIApplication sharedApplication].delegate)

Trong mã của tôi: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
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.