iOS - แอพมอบหมายวิธีการจาก ViewController


248

สิ่งที่ฉันพยายามทำคือคลิกปุ่ม (ที่สร้างขึ้นในรหัส) และให้มันเรียกตัวควบคุมมุมมองที่แตกต่างกันแล้วให้มันเรียกใช้ฟังก์ชั่นในตัวควบคุมมุมมองใหม่

ฉันรู้ว่ามันสามารถทำได้ค่อนข้างง่ายใน IB แต่นั่นไม่ใช่ตัวเลือก

ตัวอย่างของสิ่งที่ฉันต้องการจะทำคือถ้าคุณมีคอนโทรลเลอร์มุมมองสองตัวหนึ่งตัวพร้อมหน้าจอสาด ตัวควบคุมมุมมองอื่นมีการเดินผ่านของบ้านบนที่คุณสามารถผ่านห้องทั้งหมดในลำดับที่กำหนด หน้าจอเริ่มต้นจะมีปุ่มสำหรับแต่ละห้องที่จะอนุญาตให้คุณข้ามไปยังจุดใด ๆ ในระหว่างการเดินเท้า

คำตอบ:


538

คุณสามารถเข้าถึงผู้ได้รับมอบหมายเช่นนี้:

MainClass *appDelegate = (MainClass *)[[UIApplication sharedApplication] delegate];

แทนที่MainClassด้วยชื่อคลาสแอปพลิเคชันของคุณ

จากนั้นให้คุณมีคุณสมบัติสำหรับตัวควบคุมมุมมองอื่นคุณสามารถเรียกสิ่งที่ชอบ:

[appDelegate.viewController someMethod];

12
อาจต้องนำเข้าไฟล์ appDelegate.h ทุกที่ที่ใช้หรือทำ @class appDelegate
Zaky German

3
ไฟล์ appDelegate.h เป็นตัวเลือกที่ดีที่จะเข้าไปในไฟล์ส่วนหัวของคำนำหน้า / คอมไพล์แล้วของ IMO
mharper

48
หากคุณนำเข้าตัวแทนแอปของคุณใน Prefix.pch เช่น @mharper บอกว่าคุณสามารถเพิ่มสิ่งนี้ได้ในเวลาเดียวกัน: #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .degegate '[AppDelegate.viewController someMethod]' มันลดความซับซ้อนลงเล็กน้อย แต่ก็ยังทำให้การละเมิดนั้นง่ายขึ้น
Kenny Lövrin

หลังจาก @end ของไฟล์มอบหมายแอพของฉันฉันได้เพิ่ม #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) ตอนนี้ผู้ใดที่นำเข้าแอพตัวแทนชั้นเรียนสามารถใช้ [AppDelegate.viewController ได้บางวิธี]
Harveyslash

43

และถ้าใครสงสัยว่าจะทำอย่างไรในswift:

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}

ถ้าให้ appDelegate = UIApplication.sharedApplication (). มอบสิทธิ์เป็น? AppDelegate {} เป็นวิธีที่ดีกว่าในการรวดเร็ว
cbartel

@petrsyn คุณหมายถึงผู้ได้รับมอบหมายnilอะไร? นั่นคือแอปที่มี AppDelegate เสมอหรือไม่!
ฮันนี่

ในรุ่นที่ผ่านมาของสวิฟท์ควรจะเปลี่ยนsharedApplication() sharedเช่นลบ "แอปพลิเคชัน" และวงเล็บ ดังนั้นรหัสการทำงานเต็มรูปแบบของ Swift 5.2 จะเป็น: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
sfarbota

41

ดูเหมือนว่าคุณเพียงแค่ต้องUINavigationControllerติดตั้งหรือไม่

คุณสามารถรับได้AppDelegateทุกที่ในโปรแกรมผ่าน

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];

ในตัวแทนแอพของคุณคุณควรตั้งค่าตัวควบคุมการนำทางไม่ว่าจะผ่าน IB หรือในรหัส

ในรหัสสมมติว่าคุณได้สร้างตัวควบคุม 'ภาพรวมของบ้าน' แล้วมันจะเป็นอย่างนี้ในAppDelegate didFinishLaunchingWithOptions...

self.m_window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds] autorelease];
self.m_navigationController = [[[UINavigationController alloc]initWithRootViewController:homeViewController]autorelease];
[m_window addSubview:self.m_navigationController.view];

หลังจากนี้คุณต้องใช้ viewcontroller ต่อ 'ห้อง' และเรียกใช้สิ่งต่อไปนี้เมื่อมีการคลิกที่ปุ่มเหตุการณ์ ...

YourAppDelegateName* blah = (YourAppDelegateName*)[[UIApplication sharedApplication]delegate];
[blah.m_navigationController pushViewController:newRoomViewController animated:YES];

ฉันไม่ได้ทดสอบโค้ดด้านบนเพื่อให้อภัยข้อผิดพลาดทางไวยากรณ์ แต่หวังว่าโค้ดหลอกจะช่วยได้ ...


8
คำตอบของคุณถูกต้องเช่นกันฉันลงเอยด้วยการผสมผสานระหว่าง Cristian กับคำตอบของคุณ ฉันหวังว่าฉันสามารถแยกเครื่องหมายถูก
Mytheral

15

นี่คือวิธีที่ฉันทำ

[[[UIApplication sharedApplication] delegate] performSelector:@selector(nameofMethod)];

อย่าลืมนำเข้า

#import "AppDelegate.h"

13

เพียงทำตามขั้นตอนเหล่านี้

1. นำเข้าตัวแทนแอปของคุณในชั้นเรียนของคุณที่คุณต้องการให้วัตถุผู้แทนแอพ

#import "YourAppDelegate.h"

2. ในชั้นเรียนของคุณสร้างตัวอย่างของวัตถุผู้มอบหมายแอปของคุณ

YourAppDelegate *appDelegate=( YourAppDelegate* )[UIApplication sharedApplication].delegate;

3. ตอนนี้เรียกใช้เมธอดโดยใช้ตัวเลือก

if([appDelegate respondsToSelector:@selector(yourMethod)]){

        [appDelegate yourMethod];
    }

หรือโดยตรงโดย

[appDelegate yourMethod];

เพื่อความรวดเร็ว

let appdel : AppDelegate = UIApplication.shared.delegate as! AppDelegate

ฉันจะแนะนำคนแรก เรียกใช้และไป


นี่ไม่ใช่อินสแตนซ์ใหม่ของผู้รับมอบสิทธิ์ แต่เป็นการดึงข้อมูลผู้แทนเดี่ยวของแอปพลิเคชันซิงเกิล
Ammo Goettsch

11
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

มันหลีกเลี่ยงการรวม AppDelegate.h ของคุณทุกที่ มันเป็นนักแสดงที่เรียบง่ายที่ไปไกลช่วยให้การพัฒนาตัวควบคุมที่เป็นอิสระและนำมาใช้ใหม่ที่อื่นโดยไม่ต้องกังวลเกี่ยวกับชื่อชั้นและอื่น ๆ ...

สนุก


ขอบคุณสำหรับการแบ่งปันมันทำให้ฉันมีความสุขสองสามนาที probobly มันจะทำงานได้ แต่ถ้าฉันต้องการใช้วิธีเช่น visibleViewController จากมัน? มันจะให้ข้อผิดพลาดเช่นนี้: คุณสมบัติ 'visibleViewController' ไม่พบในวัตถุประเภท 'NSObject <UIApplicationDelegate> * ทางออกสำหรับสิ่งนี้?
mgyky

8

คำตอบที่ดีจำนวนมากถูกเพิ่มไปแล้ว แม้ว่าฉันต้องการเพิ่มบางสิ่งบางอย่างที่เหมาะกับฉันเกือบตลอดเวลา

#define kAppDelegate ((YourAppDelegate *)[[UIApplication sharedApplication] delegate]);

และนั่นมัน ใช้งานตลอดทั้งแอปพลิเคชันเช่นเดียวกับค่าคงที่

เช่น

[kAppDelegate methodName];

อย่าลืมนำเข้า yourAppDelegate.h ในไฟล์. pch หรือ macros ที่เกี่ยวข้อง


7

หากมีคนต้องการแบบเดียวกันใน Xamarin (Xamarin.ios / Monotouch) สิ่งนี้ใช้ได้สำหรับฉัน:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(ต้องการใช้ UIKit;)


คำสั่งที่ถูกต้องใน Swift คือให้ appdel: AppDelegate = UIApplication.shared.delegate เป็น! AppDelegate
Phil

5

และในกรณีที่คุณต้องการเข้าถึงผู้ได้รับมอบหมายส่วนขยาย WatchKit จากตัวควบคุมมุมมองบน watchOS:

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?

5

อัปเดตสำหรับ Swift 3.0 และสูงกว่า

//
// Step 1:- Create a method in AppDelegate.swift
//
func someMethodInAppDelegate() {

    print("someMethodInAppDelegate called")
}

เรียกวิธีการข้างต้นจากตัวควบคุมของคุณโดยดังต่อไปนี้

//
// Step 2:- Getting a reference to the AppDelegate & calling the require method...
//
if let appDelegate = UIApplication.shared.delegate as? AppDelegate {

    appDelegate.someMethodInAppDelegate()
}

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่


3

คุณสามารถเพิ่ม#define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]ในPrefix.pchไฟล์โครงการของคุณแล้วเรียกวิธีการใด ๆ ของคุณAppDelegateในใด ๆUIViewControllerด้วยรหัสด้านล่าง

[uAppDelegate showLoginView];

0

แม้ว่าจะเป็นไปได้ทางเทคนิค แต่ก็ไม่ใช่วิธีการที่ดี เมื่อคุณพูดว่า: "หน้าจอสแปลชจะมีปุ่มสำหรับแต่ละห้องที่จะอนุญาตให้คุณข้ามไปยังจุดใด ๆ ก็ได้ ดังนั้นคุณต้องการผ่านแอพที่ได้รับการแต่งตั้งเพื่อเรียกตัวควบคุมเหล่านี้ผ่านเหตุการณ์ tohc บนปุ่ม?

วิธีนี้ไม่เป็นไปตามหลักเกณฑ์ของ Apple และมีข้อเสียมากมาย


ดูวันที่ของคำถาม ... มันมาจากหลังเมื่อตัวสร้างส่วนต่อประสานเป็นแอปพลิเคชันแยกต่างหากและการพัฒนาเป็นสัตว์ที่แตกต่างกันมาก ฉันไม่ได้สัมผัสกับการพัฒนา iOS มาหลายปีแล้วดังนั้นฉันจึงไม่สามารถประเมินคำตอบที่ทันสมัยกว่านี้ได้
Mytheral

มันเป็น ca .. แต่การพิจารณาของฉันยังคงถูกต้อง
ingconti

0

ในปี 2020, iOS13, xCode 11.3 สิ่งที่ทำงานให้กับ Objective-C คือ:

#import "AppDelegate.h"

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

มันใช้งานได้สำหรับฉันฉันหวังว่าจะเหมือนกันสำหรับคุณ! : D

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