从一个UITableView导航到另一个appDelegate内部

时间:2013-01-21 22:36:59

标签: objective-c uinavigationcontroller navigation dropbox

第一个UITableView显示在从应用程序的RootViewController调用的Popover中。

我需要导航到同一个popover中的另一个UITableView。如果您只是实例化第二个UITableView的对象并从第一个UITableView推送它,这很容易做到。

在下一段我写的是理所当然的事情,如果我错了,请纠正我。

这里的问题是这个过程应该在appDelegate中完成。这是因为我实现了Dropbox API,我需要在登录过程完成后立即完成pushViewController,这意味着必须在应用程序内部完成UITableViews的导航:handleOpenURL。我认为应用程序:handleOpenURL必须在那里调用,这就是为什么我也必须在那里完成pushViewController,以便在Dropbox API验证窗口出现后完成导航,而不必进行用户做其他事情。

这就是我的代码的样子:

AppDelegate.h

@interface AppDelegate : NSObject <UIApplicationDelegate>{
  UINavigationController *navigationController;
    NSString *relinkUserId;
  UIWindow *window;
  TableViewControllerForStorageList *rootViewController;
  ViewController *viewController;
}
@property (nonatomic, strong) IBOutlet UIWindow *window;
@property (nonatomic, strong) IBOutlet UINavigationController *navigationController;
@property (nonatomic, strong) IBOutlet TableViewControllerForStorageList *rootViewController;
@property (nonatomic, strong) IBOutlet ViewController *viewController;

AppDelegate.m

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
  if ([[DBSession sharedSession] handleOpenURL:url]) {
        if ([[DBSession sharedSession] isLinked]) {
            [(TableViewControllerForStorageList *)self.window.rootViewController PushView];

        }
        return YES;
    }

    return NO;
}

TableViewControllerForStorageList.h

-(void)PushView;

TableViewControllerForStorageLost.m

-(void)PushView
{
  TableViewControllerIpadStorage *tableViewControllerIpadStorage = [[TableViewControllerIpadStorage alloc]initWithNibName:@"TableViewControllerIpadStorage" bundle:Nil];
  [self.navigationController pushViewController:tableViewControllerIpadStorage animated:YES];
}

当然我确定Application:HandleOpenURL正在运行,但是当从那里调用PushView时,错误是[ViewController PushView]:无法识别的选择器发送到实例

那么,如何从那里完成导航?我遗漏了哪些关于目标c的基础知识?

1 个答案:

答案 0 :(得分:2)

从您的问题中不清楚您的应用是如何构建的,因此这个答案可能不是您问题的最佳解决方案,但希望它能让您了解视图控制器层次结构可能是如何从您的应用代表中构建的。

假设您的第一个视图控制器类名为FirstViewController。您的应用程序委托可以直接引用此视图控制器的实例,也可以通过父视图控制器(可能通过window.rootViewController)访问它。

现在假设您在名为FirstViewController的{​​{1}}中有一个执行推送第二个表视图控制器的任务的方法。

您可以在应用代理的pushNextViewController方法中调用该方法。

这可能类似于:

application:handleOpenURL:

您可以通过其他方式获取[self.window.rootViewController.firstViewController pushNextViewController]; 实例的引用,如果您的FirstViewController是自定义子类,那么它会更干净,因此您可以在那里创建rootViewController方法从该方法中,将pushNextViewController个实例告诉FirstViewController

pushNextViewController

请注意,在上面的两个示例中,您需要将[self.window.rootViewController pushNextViewController]; 强制转换为它实际上是实例的任何类,否则编译器会警告您它没有属性rootViewController(示例) 1)或方法firstViewController(例2)。

编辑:如果您的pushNextViewControllerrootViewController,那么您的代码可能更像是:

UINavigationController

编辑2:好的,这里的混淆似乎是UINavigationController* navController = (UINavigationController*)window.rootViewController; FirstViewController* vc = navController.viewControllers[0]; [vc pushNextViewController]; 对象具有window属性(似乎指向您的rootViewController })然后你的app委托中也有一个navigationController实例变量。这是两个不同的对象,使您的命名约定有点令人困惑,但如果我是对的,那么以下应该有效:

rootViewController

您应该考虑将应用代表对- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { if ([[DBSession sharedSession] handleOpenURL:url]) { if ([[DBSession sharedSession] isLinked]) { [rootViewController PushView]; } return YES; } return NO; } 的引用名称更改为TableViewControllerForStorageList以外的其他名称,以减轻一些混淆。