簡體   English   中英

如何從我的 appDelegate 訪問我的 viewController? iOS

[英]How do I access my viewController from my 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;
}

您可以通過以下方式訪問它:

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

如果您將視圖嵌套在 tabviewcontroller 或導航 controller 后面,它將返回給您,您將需要訪問其中的視圖 controller

如何使用良好的老式NSNotifications從您的應用程序委托向任何正在收聽的人(例如您的視圖控制器)發送消息需要更新? 或者您可以使用Key Value Observing ,這樣您的視圖 controller 就可以在您的應用程序委托中觀看某些屬性。

由於您只有一個視圖 controller,通用方式(獨立於您的應用程序的設置方式):

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"];

Swift 方法,您可以從任何地方調用它,而不僅僅是 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
}

它作為標准 function 包含在:

https://github.com/goktugyil/EZSwiftExtensions

如果您使用基於視圖的應用程序模板,則應該可以通過應用程序委托中的屬性訪問單個視圖 controller。 它與設置為導航 controller 的根視圖 controller 的視圖 controller 相同。

如果由於某種原因你的項目設置不同,你可以得到 window 的根視圖 controller,應該是導航 controller,然后得到它的頂視圖 controller。

編輯:所以問題是這樣的:使用 iOS5 和故事板,Apple 已經提取了很多您過去可以訪問的初始設置(如果您選擇退出故事板,仍然會這樣做)。 他們更改了傳遞給 main() 的 arguments,並在 storyboard(實際上只是一個筆尖)中進行了更多設置。 恕我直言,這部分是為了防止人們通過繁重的操作使 AppDelegate 超載,就像您在自己的操作中所做的那樣。 AppDelegate 本質上是為了管理應用程序生命周期而存在的。 它並不是真的要執行將信息傳遞給視圖控制器的方法。 確實,視圖控制器的工作就是完成繁重的工作來為自己提供數據。 我建議將代碼移動到您的視圖 controller 中,也許在 viewDidLoad 中。 如果你需要知道你正在做的 launchOptions objectForKey 測試的結果,你可以非常簡單地在你的 AppDelegate 上創建一個屬性,比如 BOOL launchOptionsURLKeyExists,並適當地設置它。 然后你只需在視圖 controller 中獲取此屬性的值。你的 AppDelegate 已經是 singleton,因此你可以通過 [UIApplication sharedApplication].delegate 訪問它

編輯 2:當視圖添加到視圖 controller 中的 UIApplicationDidEnterForegroundNotification 通知時調用 viewWillAppear/viewDidAppear,並在發布該消息時做出適當響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM