wake-up-neo.com

iOS - App Delegate-Methode von ViewController aufrufen

Was ich versuche zu tun, ist, auf eine Schaltfläche (die im Code erstellt wurde) zu klicken, einen anderen View-Controller aufzurufen und dann eine Funktion im neuen View-Controller ausführen zu lassen.

Ich weiß, dass dies in IB relativ einfach möglich wäre, aber das ist keine Option.

Ein Beispiel für das, was ich tun möchte, wäre, wenn Sie zwei View-Controller hätten, einen mit einem Startbildschirm. Der andere View-Controller hatte einen Durchgang durch das Haus, so dass Sie alle Räume in einer festgelegten Reihenfolge durchgehen konnten. Der Begrüßungsbildschirm enthält Schaltflächen für jeden Raum, mit denen Sie zu jedem Punkt des Durchlaufs springen können.

234
Mytheral

Sie können auf den Delegierten wie folgt zugreifen:

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

Ersetzen Sie MainClass durch den Namen Ihrer Anwendungsklasse.

Wenn Sie eine Eigenschaft für den anderen View-Controller haben, können Sie Folgendes aufrufen:

[appDelegate.viewController someMethod];
526
Cristian Radu

Klingt, als ob Sie nur eine UINavigationController-Einstellung benötigen?

Sie können die Variable AppDelegate überall im Programm erhalten

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

In Ihrem App-Delegierten sollten Sie Ihren Navigationscontroller entweder über IB oder in Code einrichten. 

Vorausgesetzt, Sie haben Ihren Viewcontroller "Hausübersicht" bereits erstellt, wäre dies in Ihrer AppDelegatedidFinishLaunchingWithOptions... so ähnlich.

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];

Danach benötigen Sie nur noch einen Viewcontroller pro 'Raum' und rufen folgende auf, wenn ein Button-Click-Event abgerufen wird ...

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

Ich habe den obigen Code nicht getestet, verzeihen Sie also keine Syntaxfehler, hoffen Sie aber, dass der Pseudocode hilfreich ist ...

40
sradforth

Und wenn sich jemand fragt, wie man das in Swift macht:

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

So mache ich es.

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

Vergessen Sie nicht zu importieren.

#import "AppDelegate.h"
15
mikemike396

Folgen Sie einfach diesen Schritten

1.importieren Sie Ihren App-Delegaten in Ihrer Klasse, in den Sie das App-Delegatenobjekt einfügen möchten.

#import "YourAppDelegate.h"

2.In Ihrer Klasse erstellen Sie eine Instanz Ihres App-Delegatenobjekts (im Wesentlichen ein Singleton).

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

3. Jetzt Methode mit Selektor aufrufen

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

        [appDelegate yourMethod];
    }

oder direkt von

[appDelegate yourMethod];

für Swift

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

ich werde den ersten empfehlen. Laufen und gehen.

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

Es muss vermieden werden, dass Sie Ihre AppDelegate.h überall hinzufügen müssen. Es ist eine einfache Besetzung, die einen langen Weg geht und es ermöglicht, einen unabhängigen Controller zu entwickeln und ihn an anderer Stelle wiederzuverwenden, ohne sich um den Namen der Klasse usw. kümmern zu müssen.

Genießen

11

Viele gute Antworten sind bereits hinzugefügt. Obwohl ich etwas hinzufügen möchte, das mir meistens passt.

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

und das ist es. Verwenden Sie es wie eine Konstante in der gesamten Anwendung.

z.B.

[kAppDelegate methodName];

Vergessen Sie nicht, yourAppDelegate.h in die entsprechende .pch- oder Makros-Datei zu importieren.

8
ZaEeM ZaFaR

Wenn jemand dasselbe in Xamarin (Xamarin.ios/Monotouch) benötigt, hat dies für mich funktioniert

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(Benötigen Sie die Verwendung von UIKit;)

7
Daniele D.

Und falls Sie über einen View Controller auf watchOS Zugriff auf Ihren WatchKit-Erweiterungsdelegierten benötigen:

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

Update für Swift 3.0 und höher

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

    print("someMethodInAppDelegate called")
}

aufruf der obigen Methode von Ihrem Controller aus

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

    appDelegate.someMethodInAppDelegate()
}

Ausgabe:

 enter image description here

3
iajmeri43

Sie können #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] in die Prefix.pch-Datei Ihres Projekts einfügen und dann eine beliebige Methode Ihrer AppDelegate in einer beliebigen UIViewController mit dem folgenden Code aufrufen.

[uAppDelegate showLoginView];
3
Ada

Auch wenn dies technisch machbar ist, ist dies KEIN guter Ansatz. Wenn Sie sagen: "Der Begrüßungsbildschirm enthält Schaltflächen für jeden Raum, mit denen Sie zu jedem Punkt des Durchgangs springen können." Sie möchten also Appdelegate durchlaufen, um diese Controller über tohc -Ereignisse auf Schaltflächen aufzurufen?

Dieser Ansatz folgt nicht den Apple-Richtlinien und hat viele Nachteile.

0
ingconti