我有一个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;
}
答案 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,并在发布该消息时做出相应的响应。