iOS - вызов метода делегирования приложения из ViewController - PullRequest
239 голосов
/ 22 февраля 2011

То, что я пытаюсь сделать, - это нажать кнопку (которая была создана в коде) и заставить ее вызвать другой контроллер представления, а затем запустить функцию в новом контроллере представления.

Я знаю, что это можно сделать относительно легко в IB, но это не вариант.

Примером того, что я хочу сделать, было бы, если бы у вас было два контроллера представления, один с заставкой дома. На другом контроллере вида проходил через дом, чтобы вы могли пройти через все комнаты в установленном порядке. На заставке будут кнопки для каждой комнаты, которые позволят вам прыгнуть в любую точку прохода.

Ответы [ 12 ]

529 голосов
/ 22 февраля 2011

Вы можете получить доступ к делегату следующим образом:

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

Замените MainClass на имя класса вашего приложения.

Затем, если у вас есть свойство длядругой контроллер представления, вы можете вызвать что-то вроде:

[appDelegate.viewController someMethod];
41 голосов
/ 22 февраля 2011

Звучит так, как будто вам просто нужна настройка UINavigationController?

Вы можете получить AppDelegate в любом месте программы через

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

В вашем делегате приложения должна быть навигациянастройка контроллера, либо через IB, либо в коде.

В коде, если вы уже создали свой view-контроллер 'Обзор дома', это будет что-то вроде этого в вашем 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];

После этого выпросто нужен viewcontroller для каждой комнаты и вызывать следующее, когда происходит событие нажатия кнопки ...

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

Я не проверял приведенный выше код, поэтому простите за любые синтаксические ошибки, но надеюсь, что псевдокодпомогает ...

39 голосов
/ 17 октября 2014

И если кому-то интересно, как это сделать в swift:

if let myDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
   myDelegate.someMethod()
}
15 голосов
/ 08 июля 2013

Вот как я это делаю.

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

Не забудьте импортировать.

#import "AppDelegate.h"
12 голосов
/ 19 июля 2014

Просто выполните следующие действия

1. импортируйте ваш делегат приложения в ваш класс, где вы хотите объект делегата приложения.

#import "YourAppDelegate.h"

2. внутри вашего класса создайте экземпляр вашего делегата приложенияобъект (в основном одноэлементный).

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

3. Теперь вызовите метод, используя селектор

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

        [appDelegate yourMethod];
    }

или непосредственно

[appDelegate yourMethod];

для быстрого

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

Я буду рекомендовать первый.Беги и иди.

11 голосов
/ 06 февраля 2012
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

Во избежание необходимости везде включать ваш AppDelegate.h. Это простое приведение, которое проходит долгий путь, позволяя разрабатывать независимые контроллеры и использовать их в других местах, не беспокоясь об имени класса и так далее ...

Наслаждайтесь

8 голосов
/ 10 декабря 2014

Много хороших ответов уже добавлено.Хотя я хочу добавить что-то, что подходит мне большую часть времени.

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

и это все.Используйте его во всем приложении, как константу.

например,

[kAppDelegate methodName];

Не забудьте импортировать yourAppDelegate.h в соответствующий файл .pch или макрос.

7 голосов
/ 22 июля 2015

Если кому-то нужно то же самое в Xamarin (Xamarin.ios / Monotouch), это работает для меня:

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

(Требуется использование UIKit;)

5 голосов
/ 03 сентября 2015

И в случае, если вам нужен доступ к вашему делегату расширения WatchKit из контроллера представления на watchOS:

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
3 голосов
/ 05 ноября 2017

Обновление для Swift 3.0 и выше

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

    print("someMethodInAppDelegate called")
}

вызов вышеупомянутого метода из вашего контроллера следующим образом

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

    appDelegate.someMethodInAppDelegate()
}

Вывод:

enter image description here

...