iOS - App Delegate-Methode über ViewController aufrufen

248

Ich versuche, auf eine Schaltfläche (die im Code erstellt wurde) zu klicken und einen anderen Ansichtscontroller aufzurufen und dann eine Funktion im neuen Ansichtscontroller ausführen zu lassen.

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

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

Mytheral
quelle

Antworten:

538

Sie können wie folgt auf den Delegaten zugreifen:

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

Ersetzen Sie MainClass durch den Namen Ihrer Anwendungsklasse.

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

[appDelegate.viewController someMethod];
Cristian Radu
quelle
12
Möglicherweise müssen Sie auch die Datei appDelegate.h importieren, wo immer sie verwendet wird, oder @class appDelegate
Zaky German
3
Die Datei appDelegate.h ist ein guter Kandidat für die IMO-Präfix- / vorkompilierte Header-Datei des Ziels.
mharper
48
Wenn Sie Ihren App-Delegaten in Ihre Prefix.pch importieren, wie @mharper sagt, können Sie dies auch gleichzeitig hinzufügen: #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate), mit dem Sie dann wie folgt auf Ihren App-Delegaten zugreifen können '[AppDelegate.viewController someMethod]'. Es vereinfacht es ein wenig, aber es macht es auch einfacher, es zu missbrauchen.
Kenny Lövrin
nach dem @end meiner App delegate.h Datei, habe ich #define AppDelegate ((MyAppDelegateClass *) [UIApplication shared] .delegate) Jetzt AppDelegate Unabhängig davon , welche Klasse die Einfuhren direkt [AppDelegate.viewController irgendeinemethode] verwenden können
harveyslash
43

Und wenn sich jemand fragt, wie das geht swift:

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
Canhazbits
quelle
Wenn appDelegate = UIApplication.sharedApplication (). delegieren als? AppDelegate {} ist ein besserer Ansatz in Swift.
Cbartel
@petrsyn Was meinst du mit dem Delegierten nil? Ist das nicht eine App IMMER ein AppDelegate?!
Honig
In neueren Versionen von Swift sharedApplication()sollte durch ersetzt werden shared. dh "Anwendung" und die Klammern entfernen. Der vollständige if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
Arbeitscode ab
41

Klingt so, als ob Sie nur ein UINavigationControllerSetup benötigen ?

Sie können das AppDelegateüberall im Programm über bekommen

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

In Ihrem App-Delegaten sollte Ihr Navigationscontroller entweder über IB oder im Code eingerichtet sein.

Unter der Annahme, dass Sie Ihren Viewcontroller "Hausübersicht" bereits erstellt haben, wäre dies im Code in Ihrem 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];

Danach benötigen Sie nur noch einen Viewcontroller pro 'Raum' und rufen Folgendes auf, wenn ein Ereignis mit Schaltflächenklick erfasst wird ...

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

Ich habe den obigen Code nicht getestet, also verzeihen Sie Syntaxfehler, aber ich hoffe, der Pseudocode ist hilfreich ...

sradforth
quelle
8
Ihre Antwort ist ebenfalls richtig. Am Ende habe ich eine Kombination aus Cristians und Ihrer Antwort verwendet. Ich wünschte, ich könnte das Häkchen teilen.
Mytheral
15

So mache ich es.

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

Vergessen Sie nicht zu importieren.

#import "AppDelegate.h"
mikemike396
quelle
13

Befolgen Sie einfach diese Schritte

1. Importieren Sie Ihren App-Delegaten in Ihre Klasse, in die Sie ein App-Delegat-Objekt möchten.

#import "YourAppDelegate.h"

2. Erstellen Sie innerhalb Ihrer Klasse eine Instanz Ihres App-Delegatenobjekts (im Grunde genommen ein Singleton).

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

3. Rufen Sie jetzt die Methode mit dem Selektor auf

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

        [appDelegate yourMethod];
    }

oder direkt von

[appDelegate yourMethod];

für schnell

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

Ich werde den ersten empfehlen. Laufen und gehen.

Tunvir Rahman Tusher
quelle
Dies ist speziell keine neue Instanz des Delegaten, sondern ruft den Singleton-Delegaten der Singleton-Anwendung ab
Ammo Goettsch
11
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

Sie müssen Ihre AppDelegate.h nicht überall einfügen. Es ist eine einfache Besetzung, die einen langen Weg zurücklegt und es ermöglicht, unabhängige Controller zu entwickeln und an anderer Stelle wiederzuverwenden, ohne sich um den Klassennamen usw. kümmern zu müssen ...

Genießen

bruno.yvan.morel
quelle
Vielen Dank für das Teilen, es freut mich für ein paar Minuten, wahrscheinlich wird es irgendwie funktionieren, aber was ist, wenn ich eine Methode wie visibleViewController daraus verwenden möchte? Es wird ein Fehler wie der folgende ausgegeben: Die Eigenschaft 'visibleViewController' wurde für das Objekt vom Typ 'NSObject <UIApplicationDelegate> * nicht gefunden. eine Lösung dafür?
mgyky
8

Viele gute Antworten wurden bereits hinzugefügt. Obwohl ich etwas hinzufügen möchte, das mir die meiste Zeit passt.

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

und das ist es. Verwenden Sie es während der gesamten Anwendung wie eine Konstante.

z.B

[kAppDelegate methodName];

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

ZaEeM ZaFaR
quelle
7

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 mit UIKit;)

Daniele D.
quelle
Die korrekte Anweisung in Swift lautet appdel: AppDelegate = UIApplication.shared.delegate as! AppDelegate
Phil
5

Und falls Sie von einem View-Controller unter watchOS Zugriff auf Ihren WatchKit-Erweiterungsdelegierten benötigen:

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

Update für Swift 3.0 und höher

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

    print("someMethodInAppDelegate called")
}

Rufen Sie die obige Methode von Ihrem Controller aus wie folgt auf

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

    appDelegate.someMethodInAppDelegate()
}

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

iAj
quelle
3

Sie können hinzufügen , #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]in Ihrem Projekt - Prefix.pchDatei und dann jede Methode des Anruf AppDelegatein jedem UIViewControllermit dem folgenden Code ein .

[uAppDelegate showLoginView];
Ada
quelle
0

Auch wenn technisch machbar, ist dies kein guter Ansatz. Wenn Sie sagen: "Der Begrüßungsbildschirm verfügt über Schaltflächen für jeden Raum, mit denen Sie zu einem beliebigen Punkt auf dem Durchgang springen können." Sie möchten also appdelegate durchlaufen, um diese Controller über tohc-Ereignisse auf Schaltflächen aufzurufen?

Dieser Ansatz entspricht nicht den Apple-Richtlinien und weist viele Nachteile auf.

ingconti
quelle
Schauen Sie sich das Datum der Frage an ... Es ist von damals, als Interface Builder eine separate Anwendung war und die Entwicklung ein ganz anderes Biest war. Ich habe die iOS-Entwicklung seit Jahren nicht mehr berührt, daher kann ich modernere Antworten nicht bewerten.
Mytheral
es kann sein .. aber meine Überlegungen sind noch gültig
ingconti
0

Im Jahr 2020 iOS13, xCode 11.3. Was für Objective-C funktioniert, ist:

#import "AppDelegate.h"

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

Es funktioniert für mich, ich hoffe das gleiche für Sie! : D.

Breno Medeiros de Oliveira
quelle