使用 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 收到的数据到我的 ReceivedDataAppDetailViewController 我正在尝试使用以下方法来处理它,

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

如何在 Swift iOS 中自定义导航控制器

250.Spring Boot+Spring Security:基于URL动态权限:自定义AccssDesionManager

谁在 wordpress 中自定义媒体 URL?

django中的自定义登录URL