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

时间:2015-11-20 07:55:42

标签: ios objective-c storyboard uistoryboard nsurl

我有两个名为

的应用程序
  1. SendDataApp
  2. ReceiveDataApp
  3. 这是我的 ReceiveDataApp

    的StoryBoard

    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;
        }
    }
    

    但是,它给了我一些错误

      

    由于未捕获的异常终止应用程序&#39; NSGenericException&#39;,原因:&#39;无法找到segue&#39; detailIdentifier&#39;的导航控制器。 Push segues只能在源控制器由UINavigationController实例管理时使用。

    我的两个viewcontrollers仅嵌入UINavigationController。并且,通常我可以通过按钮操作查看详细信息页面。但是,不是通过网址计划

    这里的错误是什么?而且,我在这里做错了吗?

    给我一​​些建议或想法来解决这个问题。

1 个答案:

答案 0 :(得分:0)

您在AppDelegate的ViewController方法中实例化openURL,当openURL方法返回时,ARC会立即释放视图控制器。它不能存活足够长的时间才能添加到导航控制器

您真正需要做的是获取当前显示的视图控制器(可能是您的&#34; View Controller&#34;),然后执行此操作。

换句话说,在你的app delegate:

- (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 questionthis question的更多信息。

最后,你真的 必须 将你的子视图控制器重命名为超级通用&#34; View Controller&#34;和&#34;细节视图控制器&#34;名。