iOS - Appel de la méthode de délégué d'application depuis ViewController

248

Ce que j'essaie de faire est de cliquer sur un bouton (qui a été créé dans le code) et de le faire appeler un autre contrôleur de vue, puis d'exécuter une fonction dans le nouveau contrôleur de vue.

Je sais que cela pourrait être fait relativement facilement dans IB mais ce n'est pas une option.

Un exemple de ce que je veux faire serait si vous aviez deux contrôleurs de vue dont un avec un écran de démarrage de la maison. L'autre contrôleur de vue avait une promenade à travers la maison pour que vous puissiez parcourir toutes les pièces dans un ordre défini. L'écran de démarrage aurait des boutons pour chaque pièce qui vous permettraient de sauter à n'importe quel point de la promenade.

Mytheral
la source

Réponses:

538

Vous pouvez accéder au délégué comme ceci:

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

Remplacez MainClass par le nom de votre classe d'application.

Ensuite, à condition que vous ayez une propriété pour l'autre contrôleur de vue, vous pouvez appeler quelque chose comme:

[appDelegate.viewController someMethod];
Cristian Radu
la source
12
peut également avoir besoin d'importer le fichier appDelegate.h partout où il est utilisé, ou de faire @class appDelegate
Zaky German
3
Le fichier appDelegate.h est un bon candidat pour aller dans le fichier IMO de préfixe / en-tête précompilé de la cible.
mharper
48
Si vous importez votre délégué d'application dans votre Prefix.pch comme @mharper dit que vous pouvez également l'ajouter en même temps: #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) qui vous permet alors d'accéder à votre délégué d'application comme «[AppDelegate.viewController someMethod]». Cela le simplifie un peu, mais il permet également d'en abuser plus facilement.
Kenny Lövrin
après la @end de mon application fichier delegate.h, j'ai ajouté #define AppDelegate ((MyAppDelegateClass *) [UIApplication sharedApplication] .delegate) Maintenant , quel que soit les importations de classe délégué application peut utiliser directement [AppDelegate.viewController someMethod]
harveyslash
43

Et si quelqu'un se demande comment faire cela en swift:

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
canhazbits
la source
si laissez appDelegate = UIApplication.sharedApplication (). delegate as? AppDelegate {} est une meilleure approche dans swift.
cbartel
@petrsyn Que voulez-vous dire que le délégué peut être nil? N'est-ce pas une application qui a TOUJOURS un AppDelegate?!
Honey
Dans les versions récentes de Swift, sharedApplication()devrait être remplacé par shared. c'est-à-dire, supprimez "Application" et les parenthèses. Ainsi, le code de travail complet à partir de Swift 5.2 serait: if let myDelegate = UIApplication.shared.delegate as? AppDelegate { myDelegate.someMethod() }
sfarbota
41

On dirait que vous avez juste besoin d'une UINavigationControllerconfiguration?

Vous pouvez obtenir le AppDelegaten'importe où dans le programme via

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

Dans votre délégué d'application, vous devriez avoir la configuration de votre contrôleur de navigation, soit via IB ou en code.

Dans le code, en supposant que vous avez déjà créé votre Viewcontroller 'Vue d'ensemble de la maison', ce serait quelque chose comme ça dans votre 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];

Après cela, vous avez juste besoin d'un viewcontroller par «salle» et invoquez ce qui suit lorsqu'un événement de clic de bouton est détecté ...

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

Je n'ai pas testé le code ci-dessus, alors pardonnez toutes les erreurs de syntaxe, mais j'espère que le pseudo-code vous sera utile ...

sradforth
la source
8
Votre réponse est également correcte, j'ai fini par utiliser une combinaison de Cristian et de votre réponse. J'aimerais pouvoir diviser la coche.
Mytheral
15

Voilà comment je le fais.

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

N'oubliez pas d'importer.

#import "AppDelegate.h"
mikemike396
la source
13

Suivez simplement ces étapes

1. importez votre délégué d'application dans votre classe où vous voulez un objet délégué d'application.

#import "YourAppDelegate.h"

2. à l'intérieur de votre classe, créez une instance de votre objet délégué d'application (c'est fondamentalement un singleton).

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

3.Appelez maintenant la méthode en utilisant le sélecteur

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

        [appDelegate yourMethod];
    }

ou directement par

[appDelegate yourMethod];

pour rapide

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

je recommanderai le premier. Courez et partez.

Tunvir Rahman Tusher
la source
ce n'est PAS spécifiquement une nouvelle instance du délégué, mais récupère plutôt le délégué singleton de l'application singleton
Ammo Goettsch
11
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

Cela évite d'avoir à inclure votre AppDelegate.h partout. C'est une distribution simple qui va un long chemin, permettant de développer un contrôleur indépendant et de les réutiliser ailleurs sans se soucier du nom de la classe et ainsi de suite ...

Prendre plaisir

bruno.yvan.morel
la source
Merci pour le partage, cela me fait plaisir pendant quelques minutes, cela fonctionnera probablement d'une manière ou d'une autre, mais que se passe-t-il si je veux utiliser une méthode comme visibleViewController? Cela donnera une erreur comme celle-ci: la propriété 'visibleViewController' est introuvable sur l'objet de type 'NSObject <UIApplicationDelegate> *. une solution pour cela?
mgyky
8

Beaucoup de bonnes réponses sont déjà ajoutées. Bien que je veuille ajouter quelque chose qui me convient la plupart du temps.

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

et c'est tout. Utilisez-le tout au long de l'application comme une constante.

par exemple

[kAppDelegate methodName];

N'oubliez pas d'importer votreAppDelegate.h dans le fichier .pch ou macros correspondant.

ZaEeM ZaFaR
la source
7

Si quelqu'un a besoin de la même chose dans Xamarin (Xamarin.ios / Monotouch), cela a fonctionné pour moi:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(Nécessite l'utilisation d'UIKit;)

Daniele D.
la source
L'instruction correcte dans Swift est let appdel: AppDelegate = UIApplication.shared.delegate as! AppDelegate
Phil
5

Et au cas où vous auriez besoin d'accéder à votre délégué d'extension WatchKit depuis un contrôleur de vue sur watchOS:

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

Mise à jour pour Swift 3.0 et supérieur

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

    print("someMethodInAppDelegate called")
}

appeler la méthode ci-dessus à partir de votre contrôleur en suivant

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

    appDelegate.someMethodInAppDelegate()
}

Production:

entrez la description de l'image ici

iAj
la source
3

Vous pouvez ajouter #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]dans le Prefix.pchfichier de votre projet, puis appeler n'importe quelle méthode de votre AppDelegatedans any UIViewControlleravec le code ci-dessous.

[uAppDelegate showLoginView];
Ada
la source
0

Même si c'est techniquement faisable, ce n'est PAS une bonne approche. Lorsque vous dites: "L'écran de démarrage aurait des boutons pour chaque pièce qui vous permettraient de sauter à n'importe quel point de la promenade." Vous souhaitez donc passer par appdelegate pour appeler ces contrôleurs via des événements tohc sur les boutons?

Cette approche ne suit pas les directives d'Apple et présente de nombreux inconvénients.

ingconti
la source
Regardez la date sur la question ... Cela remonte à l'époque où Interface Builder était une application distincte et le développement était une bête très différente. Je n'ai pas touché au développement iOS depuis des années, je ne peux donc pas évaluer des réponses plus modernes.
Mytheral
ça peut être .. mais mes considérations sont toujours valables
ingconti
0

En 2020, iOS13, xCode 11.3. Ce qui fonctionne pour Objective-C, c'est:

#import "AppDelegate.h"

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

Ça marche pour moi, j'espère la même chose pour vous! :RÉ

Breno Medeiros de Oliveira
la source