web-dev-qa-db-fra.com

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

Ce que j'essaie de faire est de cliquer sur un bouton (créé dans le code) et de le faire appeler un autre contrôleur de vue, puis de le faire 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, un avec un écran de démarrage de la maison. L’autre contrôleur a fait une visite de la maison et a permis de 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.

234
Mytheral

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];
526
Cristian Radu

On dirait que vous avez juste besoin d'une configuration UINavigationController?

Vous pouvez obtenir la AppDelegate n'importe où dans le programme via

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

Dans le délégué de votre application, vous devez configurer votre contrôleur de navigation, via IB ou en code. 

Dans le code, en supposant que vous ayez déjà créé votre contrôleur de vue 'Vue d'ensemble de la maison', il en serait de même dans votre AppDelegatedidFinishLaunchingWithOptions...

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 contrôleur de vue par pièce et appelez ce qui suit lorsqu'un événement de clic sur un bouton est capturé ...

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

Je n'ai pas testé le code ci-dessus, donc pardonnez-vous les erreurs de syntaxe, mais espérons que le pseudo-code vous aidera ...

40
sradforth

Et si quelqu'un se demande comment faire cela dans Swift:

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

C'est comme ça que je le fais.

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

N'oubliez pas d'importer.

#import "AppDelegate.h"
15
mikemike396

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 (il s'agit essentiellement d'un singleton).

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

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

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

        [appDelegate yourMethod];
    }

ou directement par

[appDelegate yourMethod];

pour Swift

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

je recommanderai le premier. Courez et partez.

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

Cela évite d’avoir à inclure votre AppDelegate.h partout. C'est un casting simple qui va très loin, permettant de développer un contrôleur indépendant et de le réutiliser ailleurs sans se soucier du nom de classe, etc.

Prendre plaisir

11
bruno.yvan.morel

Beaucoup de bonnes réponses sont déjà ajoutées. Bien que je veuille ajouter quelque chose qui me convient le plus souvent.

#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 le fichier de macros correspondant.

8
ZaEeM ZaFaR

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

7
Daniele D.

Et si vous avez besoin d'accéder à votre délégué d'extension WatchKit à partir d'un contrôleur de vue sur watchOS:

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

Mise à jour pour Swift 3.0 et versions ultérieures

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

    print("someMethodInAppDelegate called")
}

appeler la méthode ci-dessus depuis 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()
}

Sortie:

 enter image description here

3
iajmeri43

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

[uAppDelegate showLoginView];
3
Ada

Même si cela est techniquement faisable, ce n’est PAS une bonne approche…. Lorsque vous dites: “L’écran de démarrage comporterait des boutons pour chaque pièce vous permettant de passer à n’importe quel point de la promenade.” passer par appdelegate pour appeler ces contrôleurs via des événements tohc sur des boutons?

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

0
ingconti