iOS-Calling App Delegate method from ViewController


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

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

Un ejemplo de lo que quiero hacer sería si tuvieras dos controladores de vista uno con una pantalla de bienvenida de house. El otro controlador de vista tenía un paseo por la casa en él que se podía ir a través de todas las habitaciones en un conjunto orden. La pantalla de bienvenida tendría botones para cada habitación que le permitiría saltar a cualquier punto en el paseo a través.

Author: Mytheral, 2011-02-22

12 answers

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];
 521
Author: Cristian Radu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 19:29:26

Suena como que solo necesita una configuración UINavigationController?

Puede obtener el AppDelegate en cualquier lugar del programa a través de

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

En tu app delegate debes tener la configuración de tu controlador de navegación, ya sea a través de IB o en código.

En código, suponiendo que ya hayas creado tu' House overview ' viewcontroller, sería algo como esto en tu 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 viewcontroller por 'room' e invoca lo siguiente cuando un evento de clic en un botón es recoger...

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

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

 37
Author: sradforth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-09 04:56:26

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

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
 37
Author: canhazbits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-12 17:13:16

Así es como lo hago.

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

No olvides importar.

#import "AppDelegate.h"
 14
Author: mikemike396,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-08 17:44:04

Simplemente siga estos pasos

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

#import "YourAppDelegate.h"

2.dentro de tu clase crea una instancia del objeto delegado de tu app (básicamente es un singleton).

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

3.Ahora invoque el método usando selector

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

        [appDelegate yourMethod];
    }

O directamente por

[appDelegate yourMethod];

Para swift

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

Recomendaré el primero. Corre y vete.

 11
Author: Tunvir Rahman Tusher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-18 07:26:46
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

Evita tener que incluir tu AppDelegate.h en todas partes. Es un cast simple que va un largo camino, lo que permite desarrollar Controladores independientes y reutilizarlos en otro lugar sin preocuparse por el nombre de la clase y así sucesivamente...

Disfruta

 10
Author: bruno.yvan.morel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-05 21:36:39

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 todo. Úselo en toda la aplicación como una constante.

Por ejemplo

[kAppDelegate methodName];

No se olvide de importar yourAppDelegate.h en correspondiente .archivo pch o macros.

 7
Author: ZaEeM ZaFaR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-10 10:27:05

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(Requiere usar UIKit;)

 5
Author: Daniele D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 19:51:16

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

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
 4
Author: Marco Miltenburg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-03 20:56:12

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

[uAppDelegate showLoginView];
 2
Author: Ada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-10 13:56:09

Actualización para Swift 3.0 y versiones posteriores

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

    print("someMethodInAppDelegate called")
}

Llamando al método anterior desde su controlador siguiendo

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

    appDelegate.someMethodInAppDelegate()
}

Salida:

introduzca la descripción de la imagen aquí

 2
Author: iajmeri43,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-05 05:01:49

Incluso si es técnicamente factible, NO es un buen enfoque. Cuando usted dice: "La pantalla de bienvenida tendría botones para cada habitación que le permitiría saltar a cualquier punto en el paseo a través." Así que 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 directrices de Apple y tiene muchos inconvenientes.

 0
Author: ingconti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-06 09:57:45