带有UINavigationController的独立UINavigationBar中的后退按钮

时间:2013-10-10 09:09:46

标签: ios cocoa-touch uinavigationcontroller uinavigationbar

我正在尝试实现一个俯卧撑UINavigationBar,其中导航栏的位置附加到UIScrollView的contentOffset(类似于safari在ios7中的工作方式)。

为了让动态运动正常工作,我使用以编程方式创建的UINavigationBar并添加为UIViewController的view的子视图(可以self.navbar访问)。

UIViewController位于UINavigationController层次结构中,因此我将内置self.navigationController.navigationBar隐藏在-viewWillAppear:的顶部。

我想解决的问题是在这个新的独立导航栏中添加一个后退按钮。我最好只想从navigationController及其隐藏的内置导航栏中复制按钮甚至navigationItems,但这似乎无法正常工作

我的唯一解决方案是将我的独立导航栏上的leftBarButtonItem设置为假后退按钮(当navController的导航栏中有backItem时)?这看起来有点hacky,我宁愿使用内置的backButton功能。

2 个答案:

答案 0 :(得分:3)

另一种方法是,一旦拥有自己的UINavigationBar设置,就会在导航栏上推送两个UINavigationItems,从而导致显示后退按钮。然后,您可以自定义按下后退按钮时发生的情况。

以下是我的表现

1 - 一些UINavigationItem子类,用于定义额外行为/自定义参数

@interface MyNavigationItem : UINavigationItem

//example : some custom back action when 'back' is pressed
@property (nonatomic, copy) void (^onBackClickedAction)(void);

@end

2 - 然后将其连接到UINavigationBarDelegate

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    if ([item isKindOfClass:[MyNavigationItem class]]) {
        MyNavigationItem *navItem = (MyNavigationItem *)item;


        //custom action
        if (navItem.backAction) {
            navItem.backAction();
        }
        return YES;// return NO if you don't want your bar to animate to previous item
    } else {
        return YES;
    }
}

您可以调整该方案,在后退操作上调用UINavigationController pop 方法。 这仍然是hacky

答案 1 :(得分:1)

Vinzzz的回答是一个很好的解决方案。这是我的实现,因为上下文略有不同。

在UIViewController的viewDidLoad方法中,我设置了导航栏的导航项目如下:

NSMutableArray* navItems = [@[] mutableCopy];
if (self.navigationController.viewControllers.count > 1)
{
    NSInteger penultimateIndex = (NSInteger)self.navigationController.viewControllers.count - 2;
    UIViewController* prevVC =  (penultimateIndex >= 0) ? self.navigationController.viewControllers[penultimateIndex] : nil;

    UINavigationItem* prevNavItem = [[UINavigationItem alloc] init];
    prevNavItem.title = prevVC.title;

    [navItems addObject:prevNavItem];
}

UINavigationItem* currNavItem = [[UINavigationItem alloc] init];

... <Add any other left/right buttons to the currNavItem> ...

[navItems addObject:currNavItem];
[self.navbar setItems:navItems];

...其中self.navbar是我的浮动独立UINavigationBar。

我还将当前视图控制器指定为self.navbar的委托,然后监听按下后退按钮时触发的-navigationBar:shouldPopItem:事件:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
    if (navigationBar == self.navbar)
    {
        [self.navigationController popViewControllerAnimated:YES];
        return NO;
    }
    return YES;
}

(如果您返回YES,则在ios7中使用滑动手势时会崩溃。