从UrlScheme设置ViewController的值

问题描述:

当我使用我的url方案启动应用程序时,我正努力预填一个文本字段。当应用程序没有在内存中启动时,值没有被设置(或者我认为被viewDidLoad或类似的推翻了)。从UrlScheme设置ViewController的值

的归结路上我考虑这个样子的:

// 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中设置的文字。在设置断点时,我认为这很明显,因为viewDidLoadsetLabelText之后被调用。

是否有一个更强大的路径来预先填写我缺少的自定义网址方案中的文本字段?

+0

当应用程序在后台运行,则可以使用一个NSNotification,以让你的ViewController知道,当你的应用程序使用自定义url方案打开。 – beeef

+0

“已经运行”的情况下,我的运输应用程序正常工作(不是在简单的秒杀项目,但不知道为什么)。这是造成麻烦的“新发布”。 – user1777136

尝试这种情况:

-(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; 
} 

的视图是延迟加载所以它会加载第一次需要。

+0

我想你们都是对的,但这个伎俩。当你在手动启动应用程序之后附加调试器时,请注意,当你在检查是否可以使用url模式时需要做些什么时,运行应用程序并不总是运行最新的代码。这就是为什么我最初尝试'main.view.hidden = NO;'因为我在某些测试中做了SEEMED不工作,因为模拟器运行的是旧代码。 – user1777136

原因是在调用视图控制器的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; 
}