Objective c 在appDelegate内从一个UITableView导航到另一个UITableView

Objective 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

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

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

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

这里的问题是这个过程应该在appDelegate内部完成。这是因为我正在实现Dropbox API,并且我需要在登录过程完成后立即完成pushViewController,这意味着通过UITableView的导航必须在应用程序handleOnUrl内部完成。我假设应用程序:handleopeanurl必须在那里调用,这就是为什么我还假设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;
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;
}

您应该考虑将您的应用程序委托的名称更改为 TabelVIEW控件/StutelGeList< <代码>以外的其他内容,以减轻一些混淆。

谢谢,我认为这是我需要的答案,但是如果我遵循这个指令,代码会是什么样子?“您需要将rootViewController强制转换为它实际上是其实例的任何类“?如果你想知道一般情况下打字是什么样子的,你可能应该读一读Objective-C,因为可能还有其他一些你不熟悉的关键语言特性。”。至于您的特殊情况,这取决于您要向哪个类进行类型转换,但是执行类型转换的干净代码看起来与我在上面第二次编辑中的代码类似(I typecast
rootViewController
to
UINavigationController*
)。我真的很推荐一些阅读/谷歌搜索,但是如果你想得到更具体的帮助来克服这个问题,那么在你的问题中提供一些代码让我离开。我看到了你的第二次编辑。我做了另一次编辑,删除了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;
}