Objective c 在appDelegate内从一个UITableView导航到另一个UITableView
第一个UITableView显示在从应用程序的RootViewController调用的Popover中 我需要导航到同一popover中的另一个UITableView。如果您只是实例化第二个UITableView的对象并从第一个UITableView推送它,那么这很容易做到 在下一段中,我认为一些事实是理所当然的,如果我错了,请纠正我 这里的问题是这个过程应该在appDelegate内部完成。这是因为我正在实现Dropbox API,并且我需要在登录过程完成后立即完成pushViewController,这意味着通过UITableView的导航必须在应用程序handleOnUrl内部完成。我假设应用程序:handleopeanurl必须在那里调用,这就是为什么我还假设pushViewController必须在那里完成,以便在Dropbox API验证窗口出现后完成导航,而不必让用户执行任何其他操作 我的代码是这样的: AppDelegate.hObjective c 在appDelegate内从一个UITableView导航到另一个UITableView,objective-c,uinavigationcontroller,navigation,dropbox,Objective C,Uinavigationcontroller,Navigation,Dropbox,第一个UITableView显示在从应用程序的RootViewController调用的Popover中 我需要导航到同一popover中的另一个UITableView。如果您只是实例化第二个UITableView的对象并从第一个UITableView推送它,那么这很容易做到 在下一段中,我认为一些事实是理所当然的,如果我错了,请纠正我 这里的问题是这个过程应该在appDelegate内部完成。这是因为我正在实现Dropbox API,并且我需要在登录过程完成后立即完成pushViewContr
@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;
TableViewControllerForStorageList.h
-(void)PushView;
TableViewControllerForStorageLost.m
-(void)PushView
{
TableViewControllerIpadStorage *tableViewControllerIpadStorage = [[TableViewControllerIpadStorage alloc]initWithNibName:@"TableViewControllerIpadStorage" bundle:Nil];
[self.navigationController pushViewController:tableViewControllerIpadStorage animated:YES];
}
当然,我确定Application:handleopeanurl正在运行,但从那里调用PushView时,错误是[ViewController PushView]:发送到实例的无法识别的选择器
那么,如何从那里进行导航呢?关于目标c,我缺少哪些基础知识?你的问题不清楚你的应用程序是如何构造的,因此这个答案可能不是解决你问题的最佳解决方案,但希望它能让你了解你的视图控制器层次结构可能是如何从你的应用程序代理中建立起来的 假设您的第一个视图控制器类名为
FirstViewController
。您的应用程序代理可以直接引用此视图控制器的实例,也可以通过父视图控制器访问它(可能通过window.rootViewController
)
现在假设您在FirstViewController
中有一个名为pushNextViewController
的方法,该方法执行推送第二个表视图控制器的任务
您可以从应用程序委托的应用程序:handleOpenURL:
方法中调用该方法
这可能看起来像:
[self.window.rootViewController.firstViewController pushNextViewController];
还有其他方法可以获得对FirstViewController
实例的引用,如果rootViewController
是一个自定义子类,那么它会更干净,这样您就可以在那里创建一个pushNextViewController
方法,并从该方法告诉您的FirstViewController
实例pushNextViewController
:
[self.window.rootViewController pushNextViewController];
请注意,在上面的两个示例中,您需要将rootViewController
强制转换为它实际上是其实例的任何类,或者编译器将警告您它没有属性firstViewController
(示例1)或方法pushNextViewController
(示例2)
编辑:如果您的rootViewController
是UINavigationController
,那么您的代码可能更像:
UINavigationController* navController = (UINavigationController*)window.rootViewController;
FirstViewController* vc = navController.viewControllers[0];
[vc pushNextViewController];
编辑2:好的,看起来这里的混淆是窗口
对象有一个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;
}
您应该考虑将您的应用程序委托的名称更改为
rootViewController
toUINavigationController*
)。我真的很推荐一些阅读/谷歌搜索,但是如果你想得到更具体的帮助来克服这个问题,那么在你的问题中提供一些代码让我离开。我看到了你的第二次编辑。我做了另一次编辑,删除了appDelegate的DidFinishedLaunching部分,以避免对指针的混淆。事实上,我删除了那个代码。通过编辑,它可以更好地工作,因为不会报告错误,但PushView方法仍然不会运行。我真的不明白为什么它现在能工作,为什么现在至少不报告错误。为了理解我在做什么,我遗漏了哪些基础知识?哪一个地方是阅读这些基础知识的好地方?听起来好像interface builder连接没有正确设置(或者至少没有按照我假设的方式设置)。如果您不确定代码中的IBOutlet
s与项目中的XIB文件之间的关系,那么在谷歌上搜索“ios界面生成器教程”可能会有很大帮助。我建议你也要熟悉苹果的。不幸的是,我不完全确定还有什么其他方法可以提供帮助。我不确定这是否是界面生成器的问题。当我调用PushView方法时,我发现rootViewController*TableViewControllerForStorageList实例的值为零(0X00000000)。这可能意味着它是一个新实例,在调用HandleOpenURL之前没有考虑TableViewControllerForStorageList已经运行。我不确定
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
if ([[DBSession sharedSession] handleOpenURL:url]) {
if ([[DBSession sharedSession] isLinked]) {
[rootViewController PushView];
}
return YES;
}
return NO;
}