it-swarm.com.ru

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

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

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

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

234
Mytheral

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

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

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

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

[appDelegate.viewController someMethod];
526
Cristian Radu

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

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

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

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

В коде, если вы уже создали свой viewcontroller «Обзор дома», он будет выглядеть примерно так в вашей AppDelegatedidFinishLaunchingWithOptions...

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

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

40
sradforth

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

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

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

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

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

#import "AppDelegate.h"
15
mikemike396

Просто следуйте этим шагам

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

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

12
Tunvir Rahman Tusher
NSObject <UIApplicationDelegate> * universalAppDelegate = 
    ( NSObject <UIApplicationDelegate> * ) [ [ UIApplication sharedApplication ] delegate ];

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

Наслаждаться

11
bruno.yvan.morel

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

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

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

например.

[kAppDelegate methodName];

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

8
ZaEeM ZaFaR

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

var myDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;

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

7
Daniele D.

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

extDelegate = WKExtension.sharedExtension().delegate as WKExtensionDelegate?
5
Marco Miltenburg

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

3
iajmeri43

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

[uAppDelegate showLoginView];
3
Ada

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

Этот подход не следует указаниям Apple и имеет много недостатков.

0
ingconti