การอ้างอิงตัวแปรอินสแตนซ์ AppDelegate


84

ฉันมีโครงการที่ใช้เทมเพลตแอปพลิเคชันการนำทาง ใน AppDelegate มีวิธีการ-applicationDidFinishLoading:และ-applicationWillTerminate:. ในวิธีการเหล่านั้นฉันกำลังโหลดและบันทึกข้อมูลแอปพลิเคชันและเก็บไว้ในตัวแปรอินสแตนซ์ (จริงๆแล้วมันคือกราฟวัตถุ)

เมื่อแอปพลิเคชันโหลดขึ้นมาจะโหลด MainWindow.xib ซึ่งมี NavigationConroller ซึ่งจะมี RootViewController nibNameคุณสมบัติRootViewController ชี้ไปที่ RootView (คลาสคอนโทรลเลอร์จริงของฉัน)

ในชั้นเรียนของฉันฉันต้องการอ้างถึงวัตถุที่ฉันสร้างขึ้นใน-applicationDidFinishLoading:วิธีการเพื่อที่ฉันจะได้รับการอ้างอิงถึงมัน

ใครช่วยบอกวิธีทำ ฉันรู้วิธีอ้างอิงระหว่างออบเจ็กต์ที่ฉันสร้างด้วยโปรแกรม แต่ดูเหมือนว่าฉันจะคิดไม่ออกว่าจะย้อนกลับไปทางไหนเนื่องจากขั้นตอนกลางนั้นเสร็จสิ้นจากภายในไฟล์ NIB

คำตอบ:


204

สำหรับตัวแปร (โดยปกติคือโครงสร้างข้อมูลโมเดล) ซึ่งฉันต้องการเข้าถึงได้ทุกที่ในแอปให้ประกาศในคลาส AppDelegate ของคุณ เมื่อคุณต้องการอ้างอิง:

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

7
ฉันโหวตอันนี้เพราะคุณเพิ่มนักแสดงคุณต้องแคสต์ AppDelegate ตามประเภทของคุณเองเพื่อที่คุณจะได้เห็นคุณสมบัติของคุณเองที่คุณตั้งไว้ คุณสามารถแก้ไขเพื่อให้ชัดเจนยิ่งขึ้นโดยไม่แคสต์ไปที่ "AppDelegate" แต่ ...
Kendall Helmstetter Gelner

มีวิธีเข้าถึงตัวควบคุมมุมมองรูทโดยไม่ต้องอ้างอิงถึงชื่อผู้ร่วมประชุมแอปหรือสมาชิกใด ๆ หรือไม่? (ฉันต้องการเขียนโค้ดพกพาที่ต้องการตัวควบคุมมุมมองรูท)
SK9

SK9 ทุกแอป iOS ต้องมี appDelegate โค้ดจึงจะพกพาได้!
Daniel

16

ถ้าฉันเข้าใจคำถามของคุณคุณต้องการอ้างอิงตัวแปรสมาชิก / คุณสมบัติในวัตถุ AppDelegate ของคุณหรือไม่ วิธีที่ง่ายที่สุดคือใช้ [[UIApplication sharedApplication] delegate] เพื่อส่งคืนการอ้างอิงไปยังวัตถุของคุณ

หากคุณมีคุณสมบัติที่เรียกว่าหน้าต่างคุณสามารถทำได้:

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

11

นี่คือทางเลือกแบบพกพาที่กำหนดไว้อย่างดีสำหรับ iOS4.0 ขึ้นไป:

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

หรือในบรรทัดเดียว

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

อย่าลืมตั้งค่าrootViewControllerคุณสมบัติของหน้าต่าง(พูดใน IB) มิฉะนั้นจะทำให้แจ็ค


2

กำหนดมาโครและใช้งานได้ทุกที่!

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

ในรหัสของฉัน: -

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.