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

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

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

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

Ответ 1

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

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

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

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

[appDelegate.viewController someMethod];

Ответ 2

Похоже, вам нужна установка UINavigationController?

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

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

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

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

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

Ответ 3

И если кто-то задается вопросом, как это сделать в swift:

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

Ответ 4

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

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

Не забывайте импортировать.

#import "AppDelegate.h"

Ответ 5

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

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

Enjoy

Ответ 6

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

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

Я порекомендую первый. Run и Go.

Ответ 7

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

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

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

например.

[kAppDelegate methodName];

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

Ответ 8

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

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

Ответ 9

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

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

Ответ 10

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

[uAppDelegate showLoginView];

Ответ 11

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

Вывод:

введите описание изображения здесь