1

我有一个启用 Facebook 的 iOS 5 应用程序,它使用故事板和基于 segue 的导航,并且对如何实现“iOS 原生深度链接”感到困惑。改进 iOS 上的应用程序分发中的示例代码仅显示一个UIAlertView,但我正在尝试启动两个连续的序列操作。

出于这个问题的目的,我已将应用程序简化为三个视图控制器 MYCategoryTableViewControllerMYItemsTableViewControllerMYItemViewController. 在正常流程中,应用程序打开到MYCategoryTableViewController,其中显示类别表。当用户选择一个类别时,会有一个MYItemsTableViewController显示该所选类别的项目表的segue。最后,当一个项目被选中时,会有一个MYItemViewController显示项目详细视图的 segue。

prepareForSeguefromMYCategoryTableViewController在目标视图控制器上设置一个表示该类别的属性:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ITEMS_SEGUE"]) {
        MYItemsTableViewController *vc = [segue destinationViewController];        
        MYCategory *mycategory = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForSelectedRow]];
        vc.mycategory = mycategory;
    }
}

prepareForSeguefromMYItemsTableViewController在目标视图控制器上设置一个表示该类别的属性:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ITEM_SEGUE"]) {
        MYItemViewController *vc = [segue destinationViewController];
        MYItem *myitem = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForSelectedRow]];
        vc.myitem = myitem;
    }
}

问题: 我知道我需要在 中实现一些东西application:openURL,但不知道下一步该做什么。假设传入的 URL 提供了用于查找MYCategoryMYItem对象的标识符。我发现performSegueWithIdentifier但不确定它如何与目标视图控制器交互prepareForSegue以及如何在目标视图控制器上设置模型对象。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    // get "target_url" from incoming url
    // and parse out MYCategory and MYItem identifiers

    // something like this???
    [self.window makeKeyAndVisible];
    [self.window.rootViewController performSegueWithIdentifier:@"ITEM_SEGUE" sender:self];

    return [facebook handleOpenURL:url];
}

更新: 以编程方式选择 tableview 上的单元格不执行关联的 segue给了我一个想法。也许我只是保存了 urlapplication:openURL:并让它MYCategoryTableViewController自然加载。然后在期间viewWillAppear,调用tableView selectRowAtIndexPath然后performSegueWithIdentifier过渡到MYItemsTableViewController。在 中重复相同的模式,但在调用MYItemsTableViewController之前清除 url 。performSegueWithIdentifier

4

1 回答 1

1

这是我的工作。在MYAppDelegate中,我捕获了一个表示深度链接 id 的字符串。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSString *deepLinkId;  
    // more code that parses url

    // only deep link if MYCategoryTableViewController is active controller
    UIViewController *rootContoller = self.window.rootViewController;
    if ([rootContoller isKindOfClass:[UINavigationController class]]) {
        UINavigationController *navController = (UINavigationController *)rootContoller;
        if ([navController.topViewController isKindOfClass:[MYCategoryTableViewController class]]) {
            self.deepLinkId = deepLinkId;
        }
    }
}

然后,当MYCategoryTableViewController加载时,调用selectRowAtIndexPaththen performSegueWithIdentifier

- (void)processDeepLink {  
    if (_appDelegate.deepLinkId) {
        MYItem *myitem = [MYItem lookupById:_appDelegate.deepLinkId inManagedObjectContext:_appDelegate.dataDocument.managedObjectContext];
        if (myitem) {
            NSIndexPath *indexPath = [self.fetchedResultsController indexPathForObject:myitem.mycategory];
            [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
            [self performSegueWithIdentifier:@"ITEMS_SEGUE" sender:self];
        }
    }
}

MYItemViewController加载时,类似的流程。

if (_appDelegate.deepLinkId) {
    MYItem *plate = [MYItem lookupById:_appDelegate.deepLinkId inManagedObjectContext:_appDelegate.dataDocument.managedObjectContext];
    NSIndexPath *indexPath = [self.fetchedResultsController indexPathForObject:plate];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];

    _appDelegate.deepLinkId = nil;
    [self performSegueWithIdentifier:@"ITEM_SEGUE" sender:self];
}

UIApplicationDidBecomeActiveNotification当应用程序已经打开时,我还必须观察用例。

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(processDeepLink)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];
于 2012-06-08T01:55:50.870 回答