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.
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];
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 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 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 ...
Et si quelqu'un se demande comment faire cela dans Swift
:
if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
myDelegate.someMethod()
}
C'est comme ça que je le fais.
[[[UIApplication sharedApplication] delegate] performSelector:@selector(nameofMethod)];
N'oubliez pas d'importer.
#import "AppDelegate.h"
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.
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
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.
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;)
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?
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:
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];
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.