2

我的应用程序正在使用情节提要。我想在这里发布层次结构:

视图控制器 > 标签栏控制器 > 导航控制器 > TableViewController > DetailViewController

这个详细视图控制器也有一个我通过界面构建​​器设置的标识符。

选择表上的项目显示详细视图。

我在我的应用程序中启用了自定义 URL,一切正常,除了使用 myappname://uniqueid 接收来自其他应用程序的呼叫

当我收到自定义 URL 调用时,我想显示我之前谈到的详细信息视图,但我不知道如何。

我已经使用它的标识符实例化了视图控制器,但我不知道如何在不引发错误的情况下显示它。

如何直接从 appdelegate openUrl:source 应用程序方法显示此情节提要中的视图?

4

2 回答 2

1

此问题的解决方案是从 AppDelagate 向所有视图控制器发出通知,当正确的视图控制器从 AppDelegate 自定义 URL 委托接收到此通知时,可以模态加载视图。

于 2012-05-13T18:27:53.037 回答
0

您需要让您的 UI 处于已知的就绪状态,因为不知道呼叫进入时它会在哪里。要做好准备,您需要有一个标签栏的句柄,并且能够转换将 URL 上的 uniqueid 插入到详细 vc 应该检查的模型部分。

它应该看起来像这样(对您现有的代码进行自由猜测):

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {

    // get the ui to a known state
    self.tabBarController.selectedIndex = kTHE_NAVIGATION_VC_INDEX;
    UINavigationController *nav = (UINavigationController *)self.tabBarController.selectedViewController;
    [nav popToRootViewControllerAnimated:NO];

    // parse the url to get uniqueId
    // the uniqueId specifies an object in your model that you want to have
    // inspected by the detail view controller?  you'll need that object...
    MyObject *detailObject = [self.myModel objectWithUniqueId:uniqueId];

    // the detail vc probably has an init like this?
    DetailVC *detailVC = [[DetailVC alloc] initWithModel:detailObject];

    [nav pushViewController:detailVC animated:YES];
}

编辑

要让您的应用程序委托访问它的 tabBarController,您可以设置如下属性:

// AppDelegate.h
@property (strong, nonatomic) UITabBarController *tabBarController;

// AppDelegate.m, after @implementation
@synthesize tabBarController=_tabBarController;

您是否使用故事板 segue 从启动 vc 到主应用程序?我猜是的。从启动视图控制器到主应用程序是否有不止一个 segue?我猜NO。如果这些猜测中的任何一个是错误的,您将需要调整此代码...

// SplashViewController.m

#import "AppDelegate.h"

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UITabBarController *tabBarController = (UITabBarController *)[segue destinationViewController];
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    appDelegate.tabBarController = tabBarController;
}
于 2012-04-14T16:33:15.883 回答