Objective-c:将值从 AppDelegate 传递给 UIViewController

Posted

技术标签:

【中文标题】Objective-c:将值从 AppDelegate 传递给 UIViewController【英文标题】:Objective-c: Pass value from AppDelegate to UIViewController 【发布时间】:2014-06-03 16:46:32 【问题描述】:

我正在从另一个应用程序中启动一个应用程序并传递一个值。我可以将值放入 AppDelegate,但似乎无法从 ViewController 访问它。这是我正在使用的代码:

来自 App 1(在按钮触摸时调用):

NSString* str360URL = @"customer360://?customerNum=70044321";

    BOOL canOpenURL = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:str360URL]];

    if (canOpenURL) 
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str360URL]];
    

来自 App 2 AppDelegate:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 

    if ([[url scheme] isEqualToString:@"customer360"]) 

        //check to see if we are passing in a customer number
        if ([[url query] rangeOfString:@"customerNum"].location != NSNotFound) 

            //get all the query string items (there should be only the customer num as of 6/01/14 but just in case they want to expand what is passed in
            NSArray* arrQueryComponents = [[url query] componentsSeparatedByString:@"&"];

            //loop
            for(NSString* strThisKVPair in arrQueryComponents) 

                //split the kv pairs into parts
                NSArray* arrKVPair = [strThisKVPair componentsSeparatedByString:@"="];
                //get the value from the kv pair
                self.strCustomerNum = [arrKVPair objectAtIndex:1];

            

        
...

这里有更多用于注册的代码。我可以在这里弹出一个 UIAlertView 并查看属性 self.strCustomerNum 上的正确值,所以我知道 appDelegate 将它存储在它的属性中。

在 ViewController 我有这个代码:

//pass in the customer number
    self.strCustomerNum = ((AppDelegate *)[UIApplication sharedApplication].delegate).strCustomerNum;
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"App View Controller" message:self.strCustomerNum delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
    [alert show];

但我的警报没有显示客户编号。正在导入 AppDelegate.h。关于我在哪里出错的任何想法?

【问题讨论】:

如何/何时调用视图控制器中的代码?可能在 application:openURL:sourceApplication:annotation: 中的代码执行之前创建了警报视图 我已经解决了——这就是问题所在——如果它在后台运行,则 viewDidLoad 方法已经运行。我正在从另一种运行通知的方法访问它并且它有效。但是,如果您在答案中发表评论,我会给您功劳。 完成。很高兴你找到了解决方案:) 【参考方案1】:

我的最佳猜测是,您的视图控制器中的代码在您的应用委托中的代码之前执行,因此strCustomerNum 的值为零。

您可以通过在视图控制器和应用代理的application:openURL:sourceApplication:annotation: 中设置断点来确认这一点

【讨论】:

以上是关于Objective-c:将值从 AppDelegate 传递给 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

将值从 BackgroundWorker DoWork 传递到 BackgroundWorker Completed

将值从 ngOnInit 传递到模板

将值从presentingViewController 传回presentingViewController

将值从 php 传递到 modal

通过 Laravel 中的 AJAX 发布请求将值从一个视图传递到另一个视图

将值从 uitableview 传递到 uicollectionview