使用UIStoryBoard根据自定义URLscheme处理屏幕
我有两个名为的应用程序,
- SendDataApp
- ReceiveDataApp
这是我的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; } }
但是,它给了我一些错误
终止应用程序,由于未捕获的exception'NSGenericException',原因:'无法find导航控制器for segue'detailIdentifier'。 只有当源控制器由UINavigationController的一个实例pipe理时才能使用push segues。
我只有两个embedded在UINavigationController
中的UINavigationController
。 而且,通常我可以通过button操作来查看详细页面。 但是,不是通过URL计划
这里有什么错误? 而且,我在这里做错了什么?
给我一些build议或想法来处理这个问题。
你在你的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; }
你可以在这个问题和这个问题上看到更多关于我正在试图解答的问题 。
最后,你真的必须重命名你的子视图控制器远离超级通用的“视图控制器”和“详细视图控制器”名称。