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()
}
выход:
даже если технически возможно, это не очень хороший подход. Когда вы говорите: "заставка будет иметь кнопки для каждой комнаты, которые позволят вам прыгать в любую точку на прогулке." Итак, вы хотите пройти через appdelegate, чтобы вызвать эти контроллеры через события tohc на кнопках?
этот подход не соответствует рекомендациям Apple и имеет много недостатков.