0

我试图从我的 AppDelegate 类中的 openURL 函数显示一个 ViewController,但我没有任何运气。我已经尝试了我在互联网上可以找到的所有解决方案,我不确定我做错了什么......请注意我有一个选项卡式应用程序..

我真的不想使用self.tabBarController.selectedIndex,因为我真的想像这样显示自定义构建的控制器:

CategoryTableViewController *controller = nil;
NSUInteger catId = 6;
NSString *title = @"Cat Title!";
NSManagedObjectContext *inMemoryContext = [xyzclient newContextUsingInMemoryStore:YES];
controller = [[CategoryTableViewController alloc] initWithManagedObjectContext:inMemoryContext];
[(CategoryTableViewController *) controller setParentCategory:catId];
[(CategoryTableViewController *) controller setFilterCategory:NO];
[(CategoryTableViewController *) controller setStopRefresh:YES];
controller.title = title;
[self.tabBarController.selectedViewController.navigationController pushViewController:controller animated:YES];

这是我写的代码:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSString *scheme = [url scheme];

    if ([scheme hasPrefix:@"xyz"]) {
        //Attempt 1
        UINavigationController *searchNavigationController = [self navigationControllerForViewControllerClass:[SearchTableViewController class]];
        [self.tabBarController.selectedViewController.navigationController pushViewController:searchNavigationController animated:YES];

        //Attempt 2

        NSManagedObjectContext *inMemoryContext = [DealsClient newContextUsingInMemoryStore:YES];
        SearchTableViewController *controller = [[SearchTableViewController alloc] initWithManagedObjectContext:inMemoryContext];
        [self.tabBarController.selectedViewController.navigationController pushViewController:controller animated:YES];
     }
}

- (UINavigationController *)navigationControllerForViewControllerClass:(Class)viewControllerClass {
    BaseViewController *viewController = [[viewControllerClass alloc] init];
    viewController.context = [self managedObjectContext];
    UINib *nib = [UINib nibWithNibName:@"BaseNavigationController" bundle:nil];
    UINavigationController *navigationController = [[nib instantiateWithOwner:nil options:nil] lastObject];
    navigationController.viewControllers = [NSArray arrayWithObject:viewController];

    return navigationController;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [super application:application didFinishLaunchingWithOptions:launchOptions];

    self.window.rootViewController = self.tabBarController;

    [DClient setBaseManagedObjectContext:[self managedObjectContext]];

    UINavigationController *featuredNavigationController = [self navigationControllerForViewControllerClass:[FeaturedTableViewController class]];
    featuredNavigationController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Home", nil) image:[UIImage imageNamed:@"tabbar_home"] tag:TabBarTabHome];
    UINavigationController *browseNavigationController = [self navigationControllerForViewControllerClass:[CategoryTableViewController class]];
    browseNavigationController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Browse", nil) image:[UIImage imageNamed:@"tabbar_browse"] tag:TabBarTabBrowse];
    UINavigationController *searchNavigationController = [self navigationControllerForViewControllerClass:[SearchTableViewController class]];
    searchNavigationController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Search", nil) image:[UIImage imageNamed:@"tabbar_search"] tag:TabBarTabSearch];
    UINavigationController *messagesNavigationController = [self navigationControllerForViewControllerClass:[MessagesTableViewController class]];
    messagesNavigationController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Messages", nil) image:[UIImage imageNamed:@"tabbar_messages"] tag:TabBarTabMessages];
    UINavigationController *cartNavigationController = [self navigationControllerForViewControllerClass:[CartTableViewController class]];
    cartNavigationController.tabBarItem = [[UITabBarItem alloc] initWithTitle:NSLocalizedString(@"Cart", nil) image:[UIImage imageNamed:@"tabbar_cart"] tag:TabBarTabCart];

    NSArray *viewControllers = [NSArray arrayWithObjects:featuredNavigationController, browseNavigationController, searchNavigationController, messagesNavigationController, cartNavigationController, nil];
    [self.tabBarController setViewControllers:viewControllers animated:NO];

    [xyzEngine setTabBarController:self.tabBarController];

    [self.tabBarController setCartBadgeValue:[xyz numItemsInCart]];
    NSLog(@"Loaded the page....");
    return YES;
}
4

1 回答 1

1

好的,我仍然不完全确定您要达到的目标,因此我将假设以下内容:

您有一个包含 5 个项目的选项卡栏控制器。每个项目都是具有特定类的导航控制器。根据传递给您的 url 参数,application:openURL:sourceApplication:annotation:您希望选择标签栏控制器的正确项目(之前已加载application: didFinishLaunchingWithOptions)。

这是我的尝试:

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

    if ([scheme hasPrefix:@"xyz"]) {
        Class navigationControllerClass = [SearchTableViewController class];

        NSUInteger navigationControllerIndex = [self.tabBarController.viewControllers indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
          BOOL found = [obj isKindOfClass:navigationControllerClass];
          if (found) {
            *stop = YES;
          }
          return found;
        }];

        if (NSNotFound != navigationControllerIndex) {
            self.tabBarController.selectedIndex = navigationControllerIndex;
        }
    }
}

拿 2

在您的 2 次尝试中,您正在创建一个新的导航控制器,然后尝试将其推送到某个nil(因为self.tabBarController.selectedViewController.navigationController是导航控制器)上。nilself.tabBarController.selectedViewController

无论您在导航控制器中推送什么,都不能是另一个导航控制器。因此,您需要创建一个简单的视图控制器类型UIViewController并将其推送到标签栏当前选择的导航控制器。

if ([scheme hasPrefix:@"xyz"]) {
    MYViewController *controller = [[MYViewController alloc] initWithManagedObjectContext:inMemoryContext];
    [(UINavigationController *)self.tabBarController.selectedViewController pushViewController:controller animated:YES];
}
于 2013-05-24T04:53:59.837 回答