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

2020/11/28 09:11 · ios ·  · 0评论

我有一个在xCode中创建为“基于视图的应用程序”的iOS应用程序。我只有一个viewController,但是它会自动显示,并且看不到任何代码将其绑定到我的appDelegate。我需要将数据从我的appDelegate传递给我的viewController,但不知道如何实现。

我的应用程序委托。

#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: %@", );
        NSLog(@"host: %@", );
        NSLog(@"url path: %@", );
        queryStrings = [self parseQueryString:];
        NSLog(@"query dictionary: %@", queryStrings);
    }
    else {
        queryStrings = [self parseQueryString:@"wtID=nil"];
    }

    return YES;
}

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

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

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

如何使用老式的NSNotifications从您的应用程序代理向正在收听某些需要更新的任何人(例如,您的视图控制器)发送消息?或者您可以使用键值观察,以便您的视图控制器可以监视应用程序委托中的某些属性。

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

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

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

如果由于某种原因您的项目设置不同,则可以获取窗口的根视图控制器(应该是导航控制器),然后获取其顶视图控制器。

编辑:
因此,问题是这样的:在iOS5和情节提要中,Apple提取了许多您曾经可以访问的初始设置(如果您选择退出情节提要,仍然可以这样做)。
他们更改了传递给main()的参数,并在情节提要中进行了更多设置(实际上只是笔尖)。恕我直言,这部分是为了防止人们因繁重的操作而使AppDelegate过载,就像您在自己的操作中所做的那样。本质上,存在AppDelegate来管理应用程序生命周期。这并不是要执行将信息传递给视图控制器的方法。实际上,完成繁重的工作来为其提供数据是您的视图控制器的工作。我建议将代码移到您的视图控制器中,也许在viewDidLoad中。如果您需要知道似乎正在执行的launchOptions objectForKey测试的结果,则可以非常简单地在AppDelegate上创建一个属性,例如BOOL launchOptionsURLKeyExists,并进行适当设置。然后,您只需在视图控制器中获取此属性的值即可。您的AppDelegate已经是一个单例,因此您可以通过[UIApplication sharedApplication] .delegate来访问它

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

本文地址:http://ios.askforanswer.com/ruhecongwodeappdelegatefangwenviewcontrollerdeios.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!