iOS – Método de delegación de aplicación de llamada desde ViewController

Lo que bash hacer es hacer clic en un botón (que se creó en el código) y pedirle que active un controlador de vista diferente para que ejecute 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 recorrido por la casa en el que se podía ver todas las habitaciones en un orden establecido. La pantalla de bienvenida tendría botones para cada habitación que le permitirían saltar a cualquier punto del recorrido.

Puede acceder al delegado de esta manera:

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]; 

Y si alguien se pregunta cómo hacerlo en swift :

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

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

Puede obtener AppDelegate en cualquier lugar del progtwig 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 su 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 ‘habitación’ 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 syntax, pero espero que el pseudo código sea de ayuda …

Así es como lo hago.

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

No te olvides de importar.

 #import "AppDelegate.h" 

Solo sigue estos pasos

1.importe al delegado de su aplicación en su clase donde desea el objeto delegado de la aplicación.

 #import "YourAppDelegate.h" 

2. Dentro de tu clase, crea una instancia del objeto delegado de tu aplicación (básicamente es 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]; 

por rápido

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

Yo recomendaré el primero. Corre y vete.

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

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

Disfrutar

Ya se han agregado muchas buenas respuestas. Aunque quiero agregar algo que me conviene la mayor parte del tiempo.

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

y eso es. Úselo a lo largo de la aplicación como una constante.

p.ej

 [kAppDelegate methodName]; 

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

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

 var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate; 

(Requiere usar UIKit;)

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

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

Puede agregar el #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]; 

Actualización para Swift 3.0 y superior

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

llamando al método anterior desde su controlador por seguidores

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

Salida:

enter image description here

Incluso si es técnicamente factible, NO es un buen enfoque. Cuando dices: “La pantalla de bienvenida tendría botones para cada habitación que te permitirían saltar a cualquier punto de la caminata”. Entonces, ¿desea pasar a través de delegado de aplicaciones para llamar a estos controladores a través de eventos de tohc en los botones?

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

    Intereting Posts