根据自定义URL架构从appDelegate显示视图控制器

时间:2012-04-14 13:52:26

标签: iphone objective-c ios xcode

我的应用正在使用Storyboards 我想在这里发布层次结构:

查看控制器&gt;标签栏控制器&gt; <导航控制器> TableViewController&gt; DetailViewController

此详细视图控制器还具有通过接口构建器设置的标识符。

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

我已在我的应用中启用了自定义网址,但一切正常,但接收来自其他应用的呼叫使用myappname:// uniqueid

我希望在收到自定义网址电话时显示我之前谈到的详情视图,但我不知道如何。

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

请直接从appdelegate openUrl:源应用程序方法帮助您了解如何在此故事板中显示视图。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你会想要让你的用户界面处于一个已知的准备状态,因为在呼叫进入时无法确定它的位置。要做好准备,你需要有一个标签栏的句柄,并且能够将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];
}

修改

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

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

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

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

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