У меня есть приложение для iOS, которое я создал как "основанное на представлении приложение" в XCode. У меня есть только один viewController, но он отображен автоматически, и я не вижу кода, который связывает его с моим appDelegate. Я должен передать данные от своего appDelegate до моего viewController, но не знаю, как осуществить это.
Мое приложение delegate.h:
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSDictionary *queryStrings;
@end
Кроме того, appDidFinishLoadingWithOptions:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
[[JMC sharedInstance] configureJiraConnect:@"https://cmsmech.atlassian.net/" projectKey:@"WTUPLOAD" apiKey:@"7fc060e1-a795-4135-89c6-a7e8e64c4b13"];
if ([launchOptions objectForKey:UIApplicationLaunchOptionsURLKey] != nil) {
NSURL *url = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey];
NSLog(@"url received: %@", url);
NSLog(@"query string: %@", [url query]);
NSLog(@"host: %@", [url host]);
NSLog(@"url path: %@", [url path]);
queryStrings = [self parseQueryString:[url query]];
NSLog(@"query dictionary: %@", queryStrings);
}
else {
queryStrings = [self parseQueryString:@"wtID=nil"];
}
return YES;
}
Можно получить доступ к нему с:
MyViewController* mainController = (MyViewController*) self.window.rootViewController;
, Если Вы - вложение Ваше представление позади tabviewcontroller или контроллера навигации, это возвратит это Вам, и необходимо будет получить доступ контроллеру представления в нем
Если Вы хотите получить какой-либо другой UIViewController
, не просто rootViewController
:
UIWindow *window=[UIApplication sharedApplication].keyWindow;
UIViewController *root = [window rootViewController];
UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];
Быстрый способ сделать это, можно назвать это отовсюду, не просто appdelegate:
/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups
public var topMostVC: UIViewController? {
var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while let pVC = presentedVC?.presentedViewController {
presentedVC = pVC
}
if presentedVC == nil {
print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
}
return presentedVC
}
Ее включенный как стандартная функция в:
Как насчет того, чтобы использовать старый добрый сформированный NSNotifications для отправки сообщения от приложения делегирует кому-либо слушание (например, контроллер представления), что что-то должно быть обновлено? или можно использовать Значение ключа, Наблюдая , таким образом, контроллер представления может наблюдать некоторое свойство в делегате приложения.
Так как у Вас только есть один контроллер представления, универсальный путь (независимый от того, как Ваше приложение было настроено):
UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];
При использовании Основанного на представлении Шаблона приложений единственный контроллер представления должен быть доступным через свойство в делегате приложения. Это - тот же контроллер представления, который установлен как корневой контроллер представления контроллера навигации.
, Если по некоторым причинам Ваш проект был настроен по-другому, можно получить корневой контроллер представления окна, которое должно быть контроллером навигации и затем получить его контроллер вида сверху.
РЕДАКТИРОВАНИЕ: , Таким образом, проблема - это: С iOS5 и раскадровками, Apple абстрагировала много начальной буквы, настроенной это, Вы раньше имели доступ к (и все еще сделать, если Вы выбираете из раскадровок). Они изменились, аргументы передали основному (), и приведите в порядок больше набора в раскадровке (который является действительно просто пером). По моему скромному мнению, это должно частично помешать людям перегружать AppDelegate с тяжелыми операциями, как он появляется, Вы выполняете в Вашем. AppDelegate, в сущности, существует для управления Жизненным циклом приложения. Это действительно не предназначено для выполнения методов, которые вручают от информации контроллерам представления. Это - Ваше задание контроллера представления, действительно, чтобы сделать тяжелый подъем для предоставления себе данные. Я предложил бы переместить код в Ваш контроллер представления, возможно, в viewDidLoad. Если необходимо знать результат теста launchOptions objectForKey, кажется, что Вы делаете, Вы могли очень просто создать свойство на своем AppDelegate, сказать BOOL launchOptionsURLKeyExists и установить его соответственно. Затем Вы просто захватываете значение этого свойства в Вашем контроллере представления. Вы AppDelegate уже является одиночным элементом, таким образом, можно получить доступ к нему любой [UIApplication sharedApplication] РЕДАКТИРОВАНИЕ .delegate
2: viewWillAppear/viewDidAppear называют, когда представление добавляется к уведомлению UIApplicationDidEnterForegroundNotification в Вашем контроллере представления, и ответьте соответственно, когда то сообщение добавлено.