[英]Handle screens based on Custom URL Scheme using UIStoryBoard
我有两个名为的应用程序,
这是我的ReceiveDataApp的 StoryBoard
我可以将数据发送到接收应用程序,并可以通过以下方法进行处理,
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options;
但是,这里的问题是我想将我从SendDataApp接收的数据显示给我正在尝试使用以下方法来处理它的ReceivedDataApp的 DetailViewController
,
Appdelegate.m
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *viewController = (ViewController *)[storyBoard instantiateViewControllerWithIdentifier:@"View"];
[viewController receivedURL:url];
return YES;
}
ViewController.m
- (void)receivedURL:(NSURL *)url {
[self performSegueWithIdentifier:@"detailIdentifier" sender:url];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"detailIdentifier"]) {
DetailViewController *detail = [segue destinationViewController];
detail.receivingURL = (NSURL *)sender;
}
}
但是,这给了我一些错误
由于未捕获的异常“ NSGenericException”而终止应用程序,原因:“找不到用于序列'detailIdentifier'的导航控制器。 仅当由UINavigationController的实例管理源控制器时,才可以使用“推送选择”。
我的两个viewcontrollers仅嵌入在UINavigationController
。 而且,通常我可以通过按钮操作查看详细信息页面。 但是,不是通过URL方案
这是怎么了? 而且,我在这里做错了吗?
给我一些建议或想法来解决这个问题。
您在AppDelegate的openURL
方法中实例化ViewController
,当openURL
方法返回时,ARC立即释放视图控制器。 它的生存时间不足以添加到导航控制器中
您真正需要做的是获取当前显示的视图控制器(它可能是“ View Controller
”,也可能不是),然后执行此操作。
换句话说,在您的应用程序委托中:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
UIViewController *rootvc = self.window.rootViewController;
// make sure the root view controller is the ViewController class you want
if ([rootvc isKindOfClass: [ViewController class]])
{
ViewController * vc = (ViewController *)rootvc;
[vc receivedURL:url];
}
return YES;
}
最后,您确实必须重命名子类化的视图控制器,使其名称与超级通用的“ View Controller”和“ Detail View Controller”名称不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.