Objective c 按下背杆按钮后弹出控制器
我有一个UINavigationController和一个由3个简单控制器组成的链。每个按钮都有一个按钮。按下按钮时,按下下一个控制器。ViewController1->ViewController2->ViewController3。当我按下第三视图上的后退按钮时,我想移动到第一视图。必须使用Backbarbuttonim。以下是第二个控制器的代码: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
#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
但当我按下第三个视图上的“后退”按钮时,我返回到第二个视图,而不是第一个视图。你能帮我按第三个视图上的后退按钮返回第一个视图吗。
我试着从答案中提出建议,但没有帮助
我试图实现的行为存在于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,因为我的应用程序中存在设计问题。那么你的问题就不同了,你可以在另一个问题中发布它,为什么你的后退按钮不起作用,但是一旦你可以捕获后退按钮,我的答案就起作用了。谢谢你的回复。这个问题已经过去了一段时间,我不记得细节了,但出于某些原因,我想使用一个后退按钮。我不打算检查你的解决方案,但我相信它会起作用。没问题,因为我已经尝试了很多小时寻找这个解决方案,我认为它应该在这里为其他类似的问题