Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带UINavigationController的独立UINavigationBar中的后退按钮_Ios_Cocoa Touch_Uinavigationcontroller_Uinavigationbar - Fatal编程技术网

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

Ios 带UINavigationController的独立UINavigationBar中的后退按钮,ios,cocoa-touch,uinavigationcontroller,uinavigationbar,Ios,Cocoa Touch,Uinavigationcontroller,Uinavigationbar,我正在尝试实现一个向上推的UINavigationBar,其中导航栏的位置附加到UIScrollView的contentOffset(类似于safari在ios7中的工作方式) 为了使动态移动正常工作,我使用了一个UINavigationBar,该UINavigationBar是通过编程创建的,并作为UIViewController的视图的子视图添加的(可以通过self.navbar访问) UIViewController位于UINavigationController层次结构中,因此我隐藏了顶

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

为了使动态移动正常工作,我使用了一个UINavigationBar,该UINavigationBar是通过编程创建的,并作为UIViewController的
视图的子视图添加的(可以通过
self.navbar
访问)

UIViewController位于UINavigationController层次结构中,因此我隐藏了
顶部的内置
self.navigationController.navigationBar
-视图将显示:

我试图解决的问题是在这个新的独立导航栏中添加一个后退按钮。我更愿意简单地从navigationController及其隐藏的内置导航栏复制按钮甚至navigationItems,但这似乎不起作用


将独立导航栏上的LeftBarButtonim设置为假后退按钮(当导航控制器的导航栏中有后退项时)的唯一解决方案是什么?这似乎有点老套,我更愿意使用内置的backButton功能。

另一种方法是,一旦您设置了自己的
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;
    }
}
您可以调整该方案,在返回操作时调用UINavigationControllerpop方法。
这仍然是很麻烦的

另一种方法是,一旦您设置了自己的
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;
    }
}
您可以调整该方案,在返回操作时调用UINavigationControllerpop方法。
这仍然是一个很好的解决方案。这是我的实现,因为上下文略有不同

在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];

(如果返回
YES
,当在ios7中使用滑动手势时,它将崩溃)。

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];

(如果返回
YES
,当在ios7中使用滑动手势时,它将崩溃)。

好主意,我会试试。您将UINavigationItems推到何处-视图中将显示:?我判断是否应该有后退按钮的方法是self.navigationController.viewControllers.count>1(并从count-1 ViewController获取标题)。。。你在做类似的事情吗?不,我的UINavigationBar不在我的content UIViewController中,而是在它的容器父容器中。在您的情况下,您可以将UINavigationBar移动到UINavigationController子类中,因为没有UINavigationController子类。上推导航栏仅用于特定类别的UIViewController(列表)。事实上,我正在导航到一个viewcontroller,它返回到使用标准导航栏(静态内容)的状态。我需要能够在列表->列表或列表->静态->列表之间导航。因此,对我来说,列表视图控制器拥有和管理导航栏是有意义的。到目前为止,它基本上是工作的,但我无法让后退按钮可点击并触发popItem事件(奇怪的是,它确实会通过向右滑动触发pop)。有什么想法吗?请注意,缺少可点击性是我实现导航栏的一个问题(我添加了一个彩色子视图以增强颜色,但启用了用户交互:P)好主意,我会试试。您将UINavigationItems推到何处-视图中将显示:?我判断是否应该有后退按钮的方法是self.navigationController.viewControllers.count>1(并从count-1 ViewController获取标题)。。。你在做类似的事情吗?不,我的UINavigationBar不在我的content UIViewController中,而是在它的容器父容器中。在您的情况下,您可以将UINavigationBar移动到UINavigationController子类中,因为没有UINavigationController子类。上推导航栏仅用于特定类别的UIViewController(列表)。事实上,我正在导航到一个viewcontroller,它返回到使用标准导航栏(静态内容)的状态。我需要能够在列表->列表或列表->静态->列表之间导航。因此,对我来说,列表视图控制器拥有和管理导航栏是有意义的。到目前为止,它基本上是工作的,但我无法让后退按钮可点击并触发popItem事件(奇怪的是,它确实会通过向右滑动触发pop)。有什么想法吗?请注意,缺少可点击性是我实现导航栏的一个问题(我添加了一个彩色子视图以增强颜色,但启用了用户交互:P)