如何从 UITabBarItem 获取 RootViewController

How to get the RootViewController from a UITabBarItem

我什至不确定标题是否正确,但我不明白还能如何解释它,所以就到这里吧。我将逐步向您展示我的操作,以便您理解。

首先,我正在使用 UITabBarController,其中我得到了三个不同的项目。

1) 应用程序启动,它向我展示了第一个项目,它是一个 UITableView

2) 我单击一个单元格,它会将我推向该单元格的详细视图。

3) 我从那里导航到另一个 TabBarItem

4) 我导航回第一个 TabBarItem,它仍然显示第 3 步中的视图)。我不希望我希望它显示第 1 步的第一个视图)

我怎样才能做到这一点?

假设您已经在 AppDelegate 中设置了标签栏控制器,您希望将其设为您的 <UITabBarControllerDelegate>

并且在您的 AppDelegate.m 中,您想像这样实现此方法:

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    if ([viewController isKindOfClass:[UINavigationController class]]) {
        [(UINavigationController*)viewController popToRootViewControllerAnimated:YES];
    }
}

您可以实现 UITabBarController 委托方法:

- (void)tabBarController:(UITabBarController *)tabBarController
 didSelectViewController:(UIViewController *)viewController

这会让您知道何时选择了选项卡。

然后您可以访问 UITabBarUIViewController,如果您没有对 UIViewController 的引用:

@property(nonatomic, copy) NSArray *viewControllers

从中获取要重置并调用的适当 UIViewController(或 UITableViewController)的引用:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated

UINavigationController。或者为该调用创建一个 public 方法作为调用 popToRootViewController 的方式。

编辑:

您的 AppDelegate 应如下所示:

@interface AppDelegate () <UITabBarControllerDelegate>
@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
    tabBarController.delegate = self;

    return YES;
}

- (void)tabBarController:(UITabBarController *)tabBarController
 didSelectViewController:(UIViewController *)viewController {
    NSLog(@"was selecated");
}