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()
}
Вывод:
![введите описание изображения здесь]()