如何从appDelegate访问我的viewController? iOS版

时间:2012-04-04 16:39:42

标签: ios uiviewcontroller uikit storyboard

我有一个iOS应用程序,我在xCode中创建为“基于视图的应用程序”。我只有一个viewController,但它会自动显示,我看不到任何代码将它与我的appDelegate联系起来。我需要将数据从我的appDelegate传递到我的viewController,但不知道如何解决这个问题。

我的app 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;
}

5 个答案:

答案 0 :(得分:99)

您可以通过以下方式访问它:

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

如果您将视图嵌套在tabviewcontroller或导航控制器后面,它将返回给您,您将需要访问其中的视图控制器

答案 1 :(得分:20)

如何使用优秀的老式NSNotifications向您的应用代表发送消息给任何需要更新内容的人(例如您的视图控制者)?或者您可以使用Key Value Observing,以便您的视图控制器可以在您的应用代表中查看某些属性。

答案 2 :(得分:12)

由于您只有一个视图控制器,通用方式(与应用程序的设置方式无关):

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

答案 3 :(得分:9)

如果您想获得任何其他UIViewController,而不仅仅是rootViewController

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

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

答案 4 :(得分:0)

如果您使用基于视图的应用程序模板,则应通过应用程序委托中的属性访问单个视图控制器。它被设置为导航控制器的根视图控制器的视图控制器相同。

如果由于某种原因你的项目设置不同,你可以得到窗口的根视图控制器,它应该是导航控制器,然后得到它的顶视图控制器。

修改 的 因此问题在于:使用iOS5和故事板,Apple已经抽象了许多您曾经访问过的初始设置(如果您选择退出故事板,仍然会这样做)。他们改变了传递给main()的参数,并在故事板中做了更多的设置(实际上只是一个笔尖)。恕我直言,这部分是为了防止人们因为繁重的操作而超负荷AppDelegate,就像看起来你正在做的那样。实质上,AppDelegate用于管理应用程序生命周期。这并不意味着要执行将信息传递给视图控制器的方法。这是你的视图控制器的工作,实际上,要做繁重的工作以提供数据。我建议将代码移动到视图控制器中,可能在viewDidLoad中。如果您需要知道launchOptions objectForKey测试的结果,那么您可以非常简单地在AppDelegate上创建一个属性,比如BOOL launchOptionsURLKeyExists,并进行相应的设置。然后,您只需在视图控制器中获取此属性的值。你AppDelegate已经是一个单身人士了,所以你可以通过[UIApplication sharedApplication] .delegate

来访问它。

编辑2: 当视图添加到视图控制器中的UIApplicationDidEnterForegroundNotification通知时,会调用viewWillAppear / viewDidAppear,并在发布该消息时做出相应的响应。