Вопрос по ios – Как я могу получить доступ к моему viewController из моего appDelegate? IOS

60

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

Мое приложение Delegate.h:

<code>#import <UIKit/UIKit.h>


@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSDictionary *queryStrings;

@end
</code>

Также appDidFinishLoadingWithOptions:

<code>- (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;
}
</code>

Ваш Ответ

6   ответов
20

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededdelegateError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded HackyStack
0

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

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

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

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

Error: User Rate Limit Exceededstackoverflow.com/questions/10017305/… HackyStack
Error: User Rate Limit Exceeded HackyStack
Error: User Rate Limit Exceeded HackyStack
Error: User Rate Limit Exceeded
8

UIViewControllerне толькоrootViewController:

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

UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
99

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededselfError: User Rate Limit Exceeded-windowError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded HackyStack
Error: User Rate Limit Exceeded
6

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

Error: User Rate Limit Exceeded
12

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

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

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