Objective c 按下背杆按钮后弹出控制器

Objective c 按下背杆按钮后弹出控制器,objective-c,xcode,uinavigationcontroller,backbarbuttonitem,Objective C,Xcode,Uinavigationcontroller,Backbarbuttonitem,我有一个UINavigationController和一个由3个简单控制器组成的链。每个按钮都有一个按钮。按下按钮时,按下下一个控制器。ViewController1->ViewController2->ViewController3。当我按下第三视图上的后退按钮时,我想移动到第一视图。必须使用Backbarbuttonim。以下是第二个控制器的代码: #import "ViewController2.h" static BOOL isBackButtonPressed; @implemen

我有一个UINavigationController和一个由3个简单控制器组成的链。每个按钮都有一个按钮。按下按钮时,按下下一个控制器。ViewController1->ViewController2->ViewController3。当我按下第三视图上的后退按钮时,我想移动到第一视图。必须使用Backbarbuttonim。以下是第二个控制器的代码:

#import "ViewController2.h"

static BOOL isBackButtonPressed;

@implementation ViewController2

- (void)viewDidLoad {
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back from 3" style:UIBarButtonItemStyleBordered target:nil action:nil];
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated {
    if (isBackButtonPressed) {
        [self.navigationController popViewControllerAnimated:YES];
    } else {
        isBackButtonPressed = YES;
    }
    [super viewWillAppear:animated];
}

@end
但当我按下第三个视图上的“后退”按钮时,我返回到第二个视图,而不是第一个视图。你能帮我按第三个视图上的后退按钮返回第一个视图吗。 我试着从答案中提出建议,但没有帮助

  • 向BackbarButtonim添加选择器没有帮助,因为它从未被调用
  • 在Views中添加[self.navigationController PoptorootViewController激活:是]也将不起作用。我不知道为什么。我认为真正的问题在于反政府主义是如何运作的。 还有其他建议吗

  • 我试图实现的行为存在于iPhone的日历中。当您将iPhone旋转到横向时,您将进入weeek视图。然后转到事件详细信息,并旋转到肖像。当您按下“后退”按钮时,您将看到一个日视图,而不是一个周视图,因此将跳过一个带有weekview的控制器。

    我遇到了与您相同的问题,并将其修复为:

    - (void)viewDidLoad {
       [super viewDidLoad];
       self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back from 3" style:UIBarButtonItemStyleBordered target:self action:@selector(customBackPressed:)];
    }
    
    -(void)customBackPressed:(id)sender {
            NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
            for (UIViewController *vc in viewControllers)
            {
            // If vc is ViewController2 type, remove it
            }
    
            navigationController.viewControllers = allViewControllers;
    
           [self.navigationController popViewControllerAnimated:YES];
     }
    
    您可以捕获ViewController3上的“后退”按钮,然后在弹出视图之前,从导航堆栈中删除ViewController2,如下所示:

    - (void)viewDidLoad {
       [super viewDidLoad];
       self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back from 3" style:UIBarButtonItemStyleBordered target:self action:@selector(customBackPressed:)];
    }
    
    -(void)customBackPressed:(id)sender {
            NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
            for (UIViewController *vc in viewControllers)
            {
            // If vc is ViewController2 type, remove it
            }
    
            navigationController.viewControllers = allViewControllers;
    
           [self.navigationController popViewControllerAnimated:YES];
     }
    
    因为ViewController2不再在堆栈中,它将跳转到ViewController1

    此外,如果ViewController1是根视图控制器,则只需执行以下操作:

    [self.navigationController popToRootViewControllerAnimated:YES]; 
    

    无需为“后退”按钮注册新选择器,只需执行以下操作:

    -(void)viewWillDisappear{
        if ( [self.navigationController.viewControllers containsObject:self] )
             //It means that the view controller was popped (back button pressed or whatever)
             //so we'll just pop one more view controller
             [self.navigationController popViewControllerAnimated:NO];
    }
    

    在您的
    ViewController3
    视图将消失
    方法中

    尝试在第三个视图控制器中使用此方法,这样您可以检查是否已按下后退按钮并直接弹出到根视图控制器,正如您所述,根视图控制器是您的第一个视图控制器

    -(void) viewWillDisappear:(BOOL)animated {
        if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
            [self.navigationController popToRootViewControllerAnimated:YES];
        }
        [super viewWillDisappear:animated];
    }
    

    在无数次尝试之后,我的解决方案就是不使用Backbarbuttonim!无论我做什么,它总是转到上一个viewController,而不是调用它的选择器

    相反,我只使用leftBarButtonItem进行导航,因为它保证调用我的操作

    这里有一个例子

    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 27, 22)];
    [backButton setImage:[UIImage imageNamed:@"backbutton"] forState:UIControlStateNormal];
        [backButton addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    
      self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    

    这当然称为backButtonPressed操作。。这对IOS 6和IOS 7都有效

    只是代码中的一个提示,您忘记调用
    super
    ,就像在
    [super-viewDidLoad]
    [super-viewDidLoad:animated]
    中一样。我编辑了我的代码,但这与行为无关。如果有超过三个级别,这将变得非常复杂,另外,视图1是rootviewcontroller,所以为什么不直接弹出到rootviewcontroller.Thanx以获得答复呢。也许我做错了什么,但是当我使用你的代码选择器时,没有调用。请尝试self.navigationItem.LeftBarButtonim Instead,因为我的应用程序中存在设计问题。那么你的问题就不同了,你可以在另一个问题中发布它,为什么你的后退按钮不起作用,但是一旦你可以捕获后退按钮,我的答案就起作用了。谢谢你的回复。这个问题已经过去了一段时间,我不记得细节了,但出于某些原因,我想使用一个后退按钮。我不打算检查你的解决方案,但我相信它会起作用。没问题,因为我已经尝试了很多小时寻找这个解决方案,我认为它应该在这里为其他类似的问题