设置uinavigationitem的后退按钮不起作用

时间:2014-03-31 14:17:32

标签: objective-c uikit uinavigationitem

在阅读了大量关于SO的类似问题后,我发现为了使用自定义后退按钮视图,我应该将导航控制器的导航栏的导航项的左按钮项设置为自定义视图,但不管是什么我确实陷入了默认状态。我已经尝试在我想要导航回来的视图控制器内设置这个,以及我导航回来的那个,但无济于事。我可能做错了什么想法?

- (void)loadView{
    [super loadView];
     UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc]initWithCustomView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"back-btn"]]];
    self.navigationController.navigationItem.leftBarButtonItem = backButtonItem;
    self.navigationController.navigationItem.leftBarButtonItem.tintColor = [UIColor whiteColor];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

1 个答案:

答案 0 :(得分:3)

你做错的关键是使用导航控制器上的条形按钮项而不是视图控制器。引用Apple的View Controller Catalog for iOS

  

在导航界面中,导航堆栈中的每个内容视图控制器都提供导航项作为其navigationItem属性的值。

强调我的;内容视图控制器是您的自定义视图控制器。试试这个:

self.navigationItem.leftBarButtonItem = backButtonItem;

您需要在应该具有自定义按钮的所有视图控制器中执行此操作,因此我建议您创建自己的基础视图控制器类,该类是子类UIViewController并实现自定义后退按钮,并使用此基本视图控制器作为您的其他视图控制器的父级。

您正在隐藏导航栏,如果您希望它显示自定义后退按钮,这可能不是一个好主意。

通过更换标准后退按钮,您将失去其点击行为。在条形图按钮项目的自定义视图中使用UIButton而不是UIImageView

此外,将此设置代码放在viewDidLoad而不是loadView中更为常规。

所以我会做这样的事情:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [backButton setBackgroundImage:[UIImage imageNamed:@"back-btn"] forState:UIControlStateNormal];
    [backButton sizeToFit];
    [backButton addTarget:self action:@selector(popNavigationController:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = backButtonItem;
}

- (void)popNavigationController:(id)sender
{
    [[self navigationController] popViewControllerAnimated:YES];
}

请注意,如果您使用自定义后退按钮,则从屏幕边缘滑动到后退手势将无效。有关一些可能的解决方案,请参阅this Stack Overflow question,但它很繁琐。