繁体   English   中英

使用UIStoryBoard处理基于自定义URL方案的屏幕

[英]Handle screens based on Custom URL Scheme using UIStoryBoard

我有两个名为的应用程序,

  1. SendDataApp
  2. ReceiveDataApp

这是我的ReceiveDataApp的 StoryBoard

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”而终止应用程序,原因:“找不到用于序列'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM