Ios 从UrlScheme设置ViewController上的值
当我使用我的url方案启动应用程序时,我正在努力预先填充文本字段。当应用程序在没有内存的情况下启动时,该值没有被设置(或者我认为被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)
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代码>就像我在一些测试中所做的那样,似乎不起作用,因为模拟器运行的是旧代码。