0

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

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

在下一段中,我认为一些事实是理所当然的,如果我错了,请纠正我。

这里的问题是这个过程应该在 appDelegate 内部完成。这是因为我正在实现 Dropbox API,并且我需要在登录过程完成后立即完成 pushViewController,这意味着必须在 application:handleOpenURL 内完成通过 UITableViews 的导航。我假设 application: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]: unrecognized selector sent to instance

那么,如何从那里进行导航呢?我缺少关于目标 c 的哪些基础知识?

4

1 回答 1

2

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

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

现在假设您有一个FirstViewController名为的方法,pushNextViewController它执行推送第二个表视图控制器的任务。

application:handleOpenURL:您可以从应用程序委托的方法中调用该方法。

这可能看起来像:

[self.window.rootViewController.firstViewController pushNextViewController];

还有其他方法可以获取对您的实例的引用,FirstViewController如果您rootViewController是自定义子类,那么您可以在那里创建一个pushNextViewController方法并从该方法告诉您的FirstViewController实例pushNextViewController

[self.window.rootViewController pushNextViewController];

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

编辑:如果你rootViewController是 a UINavigationController,那么你的代码可能看起来更像:

UINavigationController* navController = (UINavigationController*)window.rootViewController;
FirstViewController* vc = navController.viewControllers[0];
[vc pushNextViewController];

编辑2:好的,看起来这里的混乱是window对象有一个rootViewController属性(它似乎指向你的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不是rootViewController为了减轻一些混乱。

于 2013-01-22T01:05:02.947 回答