Подтвердить что ты не робот

Как мне получить доступ к моему диспетчеру view из моего приложения 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;
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];

Ответ 4

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

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

UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];

Ответ 5

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

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

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

EDIT: Итак, проблема в следующем: с iOS5 и раскадровки Apple отвлекла много первоначальной настройки, к которой у вас был доступ (и по-прежнему, если вы откажетесь от раскадровки). Они изменили аргументы, переданные в main(), и сделают больше настроек в раскадровке (это на самом деле просто нить). IMHO, отчасти это заставляет людей перегружать AppDelegate тяжелыми операциями, как будто вы делаете это в своей. AppDelegate, по сути, существует для управления жизненным циклом приложения. Это не значит, что вы выполняете методы, которые передают информацию вашим контроллерам. Это ваша задача диспетчера просмотров, действительно, сделать тяжелый подъем, чтобы обеспечить себя данными. Я бы предложил переместить код в ваш контроллер просмотра, возможно, в viewDidLoad. Если вам нужно знать результат теста objectOKTONE, то вы можете просто создать свойство в AppDelegate, например BOOL launchOptionsURLKeyExists, и установить его соответствующим образом. Затем вы просто берете значение этого свойства в своем контроллере вида. Вы AppDelegate уже один сингл, поэтому вы можете получить к нему доступ либо через [UIApplication sharedApplication].delegate

РЕДАКТИРОВАТЬ 2: viewWillAppear/viewDidAppear вызывается, когда представление добавляется в уведомление UIApplicationDidEnterForegroundNotification в вашем контроллере просмотра и отвечает соответствующим образом, когда это сообщение отправлено.