0

假设我有带有 2 个按钮的 ViewController A,每个按钮都连接到 ViewController B 和 C(一个按钮连接到 View B,另一个按钮连接到 C)。从 ViewController CI 连接到 ViewController D。所有 ViewController 都带有导航栏,所以从视图 B 我可以返回到 A,从视图 D i 可以返回到 D->C->A。问题是当我在视图 D 到 B 之间进行切换时:执行了切换,但现在在 B 的导航栏中,我重新调整到视图 D,并且我希望 B 会像应有的那样返回到 A。解决办法是什么????

4

1 回答 1

2

据我所知,这可以使用两种方式来完成。

1) 在 D 控制器上使用自定义后退按钮

2)改变navigationController的栈,即D控制器类中self.navigationController.viewControllers的NSArray

使用自定义后退按钮

您可以在 D 控制器中执行以下操作。仅当 A 控制器是 navigationController 的 rootViewController 时才有效。如果您正在跟踪您的 A 控制器,那么您也可以使用以下内容

  • (NSArray *)popToViewController:(UIViewController )viewController 动画:(BOOL)动画

    - (void)viewDidLoad
    {
    [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc]  initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(goBack:)];
     self.navigationItem.leftBarButtonItem = backButton;
      self.navigationItem.hidesBackButton = YES;
    }
    
    -(void)goBack:(id)sender
    {
    [self.navigationController popToRootViewControllerAnimated:YES];
    

    }

更改navigationController的堆栈

如果您想导航到特定的控制器,这很有用。但是从 B 回到 A 控制器后,后退按钮仍然显示,您可能需要通过一些更改来查看自己。不要尝试更改导航堆栈prepareForSegue

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
    NSMutableSet *controllersToRemove = [NSMutableSet new];
        for (id viewController in controllers) {
            if (![viewController isKindOfClass:[self class]]&&![viewController isKindOfClass:[NRViewController class]]) {
                    [controllersToRemove addObject:viewController];
                }
        }

        for (id controller in controllersToRemove) {
            [controllers removeObject:controller];
        }
    self.navigationController.viewControllers = controllers;
}

自定义后退按钮的编辑代码

如果你想要原来的后退按钮

您必须为此使用图像,代码如下

UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 60.0f, 30.0f)];
    UIImage *backImage = [[UIImage imageNamed:@"back_button_normal.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12.0f, 0, 12.0f)];
    [backButton setBackgroundImage:backImage  forState:UIControlStateNormal];
    [backButton setTitle:@"Back" forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = backButtonItem;
于 2014-03-11T21:01:29.457 回答