iOS-вызов метода делегата приложения из ViewController

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

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

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

12 ответов


Вы можете получить доступ к делегату такой:

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

заменить MainClass С именем класса приложения.

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

[appDelegate.viewController someMethod];

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

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

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

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

в коде, предполагая, что вы уже создали свой viewcontroller "обзор дома", это будет что-то вроде этого в вашем 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];

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


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

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

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

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

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

#import "AppDelegate.h"

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

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

#import "YourAppDelegate.h"

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

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

3.Теперь вызовите метод с помощью selector

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

        [appDelegate yourMethod];
    }

или

[appDelegate yourMethod];

для swift

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

я рекомендую первый. Беги и уходи.


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

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

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


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

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

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

например

[kAppDelegate methodName];

Не забудьте импортировать yourAppDelegate.h в соответствии .файл ПЧ или макросы.


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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

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


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

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

вы можете добавить #define uAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] в вашем проекте Prefix.pch файл, а затем вызовите любой метод вашего AppDelegate в любом UIViewController С приведенным ниже кодом.

[uAppDelegate showLoginView];

обновление для 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


даже если технически возможно, это не очень хороший подход. Когда вы говорите: "заставка будет иметь кнопки для каждой комнаты, которые позволят вам прыгать в любую точку на прогулке." Итак, вы хотите пройти через appdelegate, чтобы вызвать эти контроллеры через события tohc на кнопках?

этот подход не соответствует рекомендациям Apple и имеет много недостатков.