Как я получаю доступ к своему viewController от моего appDelegate? iOS

У меня есть приложение для 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;
}
62
задан 4 April 2012 в 21:50

6 ответов

Можно получить доступ к нему с:

MyViewController* mainController = (MyViewController*)  self.window.rootViewController;

, Если Вы - вложение Ваше представление позади tabviewcontroller или контроллера навигации, это возвратит это Вам, и необходимо будет получить доступ контроллеру представления в нем

101
ответ дан 31 October 2019 в 13:32

Если Вы хотите получить какой-либо другой UIViewController, не просто rootViewController:

UIWindow *window=[UIApplication sharedApplication].keyWindow;
UIViewController *root = [window rootViewController];

UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];
9
ответ дан 31 October 2019 в 13:32

Быстрый способ сделать это, можно назвать это отовсюду, не просто 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
}

Ее включенный как стандартная функция в:

https://github.com/goktugyil/EZSwiftExtensions

6
ответ дан 31 October 2019 в 13:32

Как насчет того, чтобы использовать старый добрый сформированный NSNotifications для отправки сообщения от приложения делегирует кому-либо слушание (например, контроллер представления), что что-то должно быть обновлено? или можно использовать Значение ключа, Наблюдая , таким образом, контроллер представления может наблюдать некоторое свойство в делегате приложения.

21
ответ дан 31 October 2019 в 13:32

Так как у Вас только есть один контроллер представления, универсальный путь (независимый от того, как Ваше приложение было настроено):

UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];
12
ответ дан 31 October 2019 в 13:32

При использовании Основанного на представлении Шаблона приложений единственный контроллер представления должен быть доступным через свойство в делегате приложения. Это - тот же контроллер представления, который установлен как корневой контроллер представления контроллера навигации.

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

РЕДАКТИРОВАНИЕ: , Таким образом, проблема - это: С iOS5 и раскадровками, Apple абстрагировала много начальной буквы, настроенной это, Вы раньше имели доступ к (и все еще сделать, если Вы выбираете из раскадровок). Они изменились, аргументы передали основному (), и приведите в порядок больше набора в раскадровке (который является действительно просто пером). По моему скромному мнению, это должно частично помешать людям перегружать AppDelegate с тяжелыми операциями, как он появляется, Вы выполняете в Вашем. AppDelegate, в сущности, существует для управления Жизненным циклом приложения. Это действительно не предназначено для выполнения методов, которые вручают от информации контроллерам представления. Это - Ваше задание контроллера представления, действительно, чтобы сделать тяжелый подъем для предоставления себе данные. Я предложил бы переместить код в Ваш контроллер представления, возможно, в viewDidLoad. Если необходимо знать результат теста launchOptions objectForKey, кажется, что Вы делаете, Вы могли очень просто создать свойство на своем AppDelegate, сказать BOOL launchOptionsURLKeyExists и установить его соответственно. Затем Вы просто захватываете значение этого свойства в Вашем контроллере представления. Вы AppDelegate уже является одиночным элементом, таким образом, можно получить доступ к нему любой [UIApplication sharedApplication] РЕДАКТИРОВАНИЕ .delegate

2: viewWillAppear/viewDidAppear называют, когда представление добавляется к уведомлению UIApplicationDidEnterForegroundNotification в Вашем контроллере представления, и ответьте соответственно, когда то сообщение добавлено.

0
ответ дан 31 October 2019 в 13:32

Другие вопросы по тегам:

Похожие вопросы: