2011-04-07 59 views
0


我有一个基于Utility模板的应用程序(即Main和Flip视图控制器)。翻转视图允许选择要在主视图上使用的特定项目。到目前为止 - 效果很好。如何在已打开的应用程序中处理自定义网址?

现在我试着添加一个自定义的URL。一些效果如下:myapp://itemID=40基本上会告诉主要观点:“不需要翻转 - 你会处理项目40”。

我注册的URL类型方案为“myapp”,并添加下面的方法来应用程序的委托:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    if (!url) { 
     return NO; 
    } 

    NSString *urlString = [url absoluteString]; 
    NSLog(@"URL received: %@", urlString); 
    NSString *itemID = [urlString stringByReplacingOccurrencesOfString:@"myapp://itemID=" withString:@""]; 
    NSLog(@"Item received: %@", itemID); 
    [_mainViewController setStartupItem:itemID]; 
    return YES; 
} 

正如你所看到的,itemID被设置为在mainViewController称为startupItem财产。

我加入一行到正规application方法来验证startupItemnil在任何URL的情况下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //Make sure URL string is empty 
    [_mainViewController setStartupItem:nil]; 

    // Override point for customization after application launch. 
    // Add the main view controller's view to the window and display. 
    self.window.rootViewController = self.mainViewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

而在MainViewController.m我添加的代码来处理项目的viewDidLoad事件。

这里是我的问题:如果应用程序是第一次从URL启动,则此方案效果很好。如果它已经在运行,那么我们再也不会到达viewDidLoad,因此不会处理那个特定的物品,而是继续,如果没有通过。

我的卑微的问题是:哪个UIViewController应该放入我的处理代码?或者,我是否以错误的方式接近了这一切?这应该在我的模型中处理?

一如既往,在此先感谢您的时间!

Guy

回答

1

绝对不是在应用程序启动时只调用一次的方法!您需要在自己的方法中重构项目处理代码,然后在viewDidLoad(在启动过程中调用一次)和handleOpenURL(每次调用它时调用此方法)中调用此方法。

+0

已经重构为其自己的功能,但希望有一个单一的调用点(对Windows焦点事件的影响)。 – 2011-04-07 07:02:45

3

我会看看UIApplicationDelegate协议的文档,特别是;

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 

而这已被弃用。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
相关问题