使用 UIStoryBoard 基于自定义 URL 方案处理屏幕
Posted
技术标签:
【中文标题】使用 UIStoryBoard 基于自定义 URL 方案处理屏幕【英文标题】:Handle screens based on Custom URL Scheme using UIStoryBoard 【发布时间】:2015-11-20 07:55:42 【问题描述】:我有两个名为的应用程序,
-
SendDataApp
接收数据应用程序
这是我的 ReceiveDataApp
故事板我可以将数据发送到我的接收应用程序并可以通过以下方法处理它,
- (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”而终止应用程序,原因:“找不到用于 segue 'detailIdentifier' 的导航控制器。只有当源控制器由 UINavigationController 的实例管理时,才能使用推送 segue。
我的两个视图控制器仅嵌入在 UINavigationController
中。而且,通常我可以通过按钮操作查看详细信息页面。但是,不是通过 URL Scheme
这里的错误是什么?而且,我在这里做错了吗?
给我一些建议或想法来处理这个问题。
【问题讨论】:
【参考方案1】:您在 AppDelegate 的 openURL
方法中实例化您的 ViewController
,当 openURL
方法返回时,ARC 会立即释放视图控制器。它的生存时间不够长,无法添加到导航控制器中
您真正需要做的是获取当前显示的视图控制器(可能是也可能不是您的“View Controller
”),然后对其执行 segue。
换句话说,在您的应用委托中:
- (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;
你可以看到更多我想要做的答案in this question和this question。
最后,您确实必须重命名您的子类视图控制器,远离超通用的“视图控制器”和“详细视图控制器”名称。
【讨论】:
正如你在聊天中提到的,你的根视图控制器是一个导航控制器(因为它可能适用于任何使用导航控制器的人)。所以在这种情况下你会use something like "[self.navigationController visibleViewController]
" to get the current view controller。以上是关于使用 UIStoryBoard 基于自定义 URL 方案处理屏幕的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UINavigationItem 类 - 标题取决于 Active UIStoryboard
UIStoryBoard 和 UIPageViewController 和 initWithTransitionStyle
250.Spring Boot+Spring Security:基于URL动态权限:自定义AccssDesionManager