0


我有一个基于实用程序模板的应用程序(即主视图控制器和翻转视图控制器)。翻转视图允许选择要在主视图上使用的特定项目。到目前为止 - 效果很好。

现在我尝试添加自定义 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被设置为startupItemmainViewController.

然后,我在常规方法中添加了一行,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我应该把我的处理代码放在哪个?或者,我是否以错误的方式接近这一切?这应该在我的模型中处理吗?

与往常一样,提前感谢您的宝贵时间!

盖伊

4

2 回答 2

3

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

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

而这已被弃用。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
于 2011-12-06T15:40:25.153 回答
1

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

于 2011-04-07T06:49:39.267 回答