第一个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的基础知识?
答案 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)。
编辑:如果您的pushNextViewController
是rootViewController
,那么您的代码可能更像是:
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
以外的其他名称,以减轻一些混淆。