Ios 从UrlScheme设置ViewController上的值

Ios 从UrlScheme设置ViewController上的值,ios,objective-c,Ios,Objective C,当我使用我的url方案启动应用程序时,我正在努力预先填充文本字段。当应用程序在没有内存的情况下启动时,该值没有被设置(或者我认为被viewDidLoad或类似的设置所推翻) 我采用的简化路径如下所示: // AppDelegate.m -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)

当我使用我的url方案启动应用程序时,我正在努力预先填充文本字段。当应用程序在没有内存的情况下启动时,该值没有被设置(或者我认为被
viewDidLoad
或类似的设置所推翻)

我采用的简化路径如下所示:

// AppDelegate.m
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    UINavigationController *nav = (UINavigationController *)[[application keyWindow] rootViewController];

    MainViewController *main = (MainViewController *)[nav topViewController];

    [main setLabelText:@"this should be shown on screen"];

    return YES;
}
使用
ViewController
坐在
UINavigationController

// MainViewController.m
@interface MainViewController ()

@property (weak, nonatomic) IBOutlet UILabel *someLabel;

@end

@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.someLabel.text = @"this is actually shown on screen";
}

- (void)setLabelText:(NSString *)text
{
    self.someLabel.text = text;
}

@end
因此标签显示“这实际上显示在屏幕上”,而不是我在
AppDelegate
中设置的文本。当设置断点时,我想这是很明显的原因,因为
viewDidLoad
是在
setLabelText
之后调用的

是否有一种更可靠的方法可以从我缺少的自定义url方案中预填充文本字段?

尝试以下方法:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    UINavigationController *nav = (UINavigationController *)[[application keyWindow] rootViewController];

    MainViewController *main = (MainViewController *)[nav topViewController];
    main.view;

    [main setLabelText:@"this should be shown on screen"];

    return YES;
}

视图是延迟加载的,因此它将在第一次需要时加载。

原因是在调用视图控制器的
viewDidLoad
方法之前,从应用程序委托调用
setLabelText:
。您需要做的是在视图控制器的属性中保留字符串的副本,然后在
viewDidLoad
中的标签上设置该副本:

标题:

@interface MainViewController

@property (nonatomic, copy) NSString *stringToSet;

@end
实施:

@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if (self.stringToSet) {
        self.someLabel.text = self.stringToSet;
    } else {
        self.someLabel.text = @"Some default string";
    }
}

@end
应用程序代表:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    UINavigationController *nav = (UINavigationController *)[[application keyWindow] rootViewController];

    MainViewController *main = (MainViewController *)[nav topViewController];

    [main setStringToSet:@"this should be shown on screen"];

    return YES;
}

当应用程序在后台运行时,您可以使用NSNotification,让您的ViewController知道您的应用程序是在使用自定义url方案打开的。对于我的发货应用程序,“已在运行”案例可以正常工作(但不在简单的spike项目中,不知道为什么)。是“新的发射”引起了麻烦。我想你们都是对的,但这确实起了作用。在手动启动应用程序后附加调试器时,以及在检查url方案是否有效时,需要注意的是,运行应用程序并不总是运行最新的代码。这就是为什么我最初的尝试
main.view.hidden=NO就像我在一些测试中所做的那样,似乎不起作用,因为模拟器运行的是旧代码。