【问题标题】:Handle screens based on Custom URL Scheme using UIStoryBoard使用 UIStoryBoard 基于自定义 URL 方案处理屏幕
【发布时间】:2015-11-20 07:55:42
【问题描述】:

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

  1. SendDataApp
  2. 接收数据应用程序

这是我的 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

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

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

【问题讨论】:

    标签: ios objective-c storyboard uistoryboard nsurl


    【解决方案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 questionthis question

    最后,您确实必须重命名您的子类视图控制器,远离超通用的“视图控制器”和“详细视图控制器”名称。

    【讨论】:

    猜你喜欢
    • 2017-07-18
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多