protocolos delegate delegados ios objective-c uiviewcontroller appdelegate

ios - delegados - delegate swift



iOS: método de delegado de la aplicación de llamada de ViewController (12)

¿Parece que solo necesitas una configuración de UINavigationController ?

Puede obtener la AppDelegate en cualquier parte del programa a través de

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

En el delegado de su aplicación, debe tener la configuración de su controlador de navegación, ya sea a través de IB o en código.

En el código, suponiendo que haya creado el controlador de vista ''Visión general de la casa'' ya sería algo así en su 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];

Después de esto, solo necesita un controlador de visualización por ''sala'' e invocar lo siguiente cuando se selecciona un evento de clic de botón ...

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

No he probado el código anterior, así que perdona cualquier error de sintaxis, pero espero que el pseudo código sea de ayuda ...

Lo que estoy tratando de hacer es hacer clic en un botón (que fue creado en el código) y hacer que llame a un controlador de vista diferente y luego ejecutar una función en el nuevo controlador de vista.

Sé que podría hacerse con relativa facilidad en IB, pero esa no es una opción.

Un ejemplo de lo que quiero hacer sería si tuviera dos controladores de vista, uno con una pantalla de bienvenida de la casa. El otro controlador de vista tenía un paseo por la casa en el que podía recorrer todas las habitaciones en un orden establecido. La pantalla de inicio tendría botones para cada habitación que le permitirían saltar a cualquier punto del recorrido.


Así es como lo hago.

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

No te olvides de importar.

#import "AppDelegate.h"


Incluso si es técnicamente factible, NO es un buen enfoque. Cuando dices: "La pantalla de inicio tendría botones para cada habitación que te permitirían saltar a cualquier punto del recorrido". ¿Desea pasar a través de appdelegate para llamar a estos controladores a través de eventos tohc en los botones?

Este enfoque no sigue las pautas de Apple y tiene muchos inconvenientes.


Puede agregar #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] en el archivo Prefix.pch su proyecto y luego llamar a cualquier método de su AppDelegate en cualquier UIViewController con el siguiente código.

[uAppDelegate showLoginView];


Puedes acceder al delegado así:

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

Reemplace MainClass con el nombre de su clase de aplicación.

Luego, siempre que tenga una propiedad para el otro controlador de vista, puede llamar a algo como:

[appDelegate.viewController someMethod];


Si alguien necesita lo mismo en Xamarin (Xamarin.ios / Monotouch), esto funcionó para mí:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(Requiere usar UIKit;)


Solo sigue estos pasos

1.Importe el delegado de su aplicación en su clase donde desee el objeto de delegado de aplicación.

#import "YourAppDelegate.h"

2. Dentro de su clase, cree una instancia de su objeto de delegado de aplicación (es básicamente un singleton).

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

3. Ahora invoque el método usando el selector

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

o directamente por

[appDelegate yourMethod];

para rápido

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

Recomendaré el primero. Corre y anda.


Y en caso de que necesite acceso a su delegado de la extensión WatchKit desde un controlador de vista en watchOS:

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


Y si alguien se pregunta cómo hacer esto de manera swift :

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


Ya se han añadido muchas buenas respuestas. Aunque quiero añadir algo que me convenga la mayor parte del tiempo.

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

y eso es. Úsalo en toda la aplicación como una constante.

p.ej

[kAppDelegate methodName];

No olvide importar suAppDelegate.h en el archivo .pch o macros correspondiente.


Actualización para Swift 3.0 y superior

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

llamando por encima del método de su controlador por lo siguiente

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

Salida:


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

Evita tener que incluir tu AppDelegate.h en todas partes. Es un elenco simple que va por un largo camino, lo que permite desarrollar un controlador independiente y reutilizarlo en otro lugar sin tener que preocuparse por el nombre de la clase, etc.

Disfrutar