Как получить доступ к моему viewController из моего appDelegate? усвн



у меня есть приложение iOS, которое я создал как "приложение на основе представления" в xCode. У меня есть только один viewController, но он отображается автоматически, и я не вижу кода, который связывает его с моим appDelegate. Мне нужно передать данные из моего appDelegate в мой viewController, но не знаю, как это сделать.



Мои приложения делегата.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;
}
766   6  

6 ответов:

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

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

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

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

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

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

Если вы хотите получить любой другой 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
}

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

https://github.com/goktugyil/EZSwiftExtensions

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

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

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

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

Comments

    Ничего не найдено.