捕捉 UINavigationController 本机后退按钮操作

Posted

技术标签:

【中文标题】捕捉 UINavigationController 本机后退按钮操作【英文标题】:Catching UINavigationController's native back button action 【发布时间】:2011-11-04 18:08:44 【问题描述】:

关于覆盖导航控制器的后退按钮动作有很多问题,但每个人都说没有直接的方法可以做到这一点。我通过继承 UINavigationController 并覆盖 UINavigationBarDelegate 方法来实现这一点。但是问题是 UINavigationController 的接口没有实现 UINavigationBarDelegate 协议(但它实现了这个方法,因为这段代码有效:),我担心这个应用程序会被苹果拒绝,考虑到这里使用了未记录的 API。

所以,问题是:您如何看待,是否是私有 API 使用?代码如下:

@interface CustomNavigationController : UINavigationController <UINavigationBarDelegate>

@end

@implementation CustomNavigationController

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 
    BOOL shouldPop = [[self topViewController] enableBackButton]; // every view controller overrides this method to disable or enable pop of view controller
    if (shouldPop) 
        //here is the warning about "UINavigationController may not respond to selector"
        return [super navigationBar:navigationBar shouldPopItem:item];
     else 
        return NO;
    


@end

【问题讨论】:

是UINavigationBarDelegate的协议方法:[super navigationBar:navigationBar shouldPopItem:item]; UINavigationController 没有实现 UINavigationBarDelegate 协议。 【参考方案1】:

Apple 关于 UINavigationController 的文档:此类不适用于子类化。

虽然此意图不是禁令,并且在技术上可能不会让您被拒绝(使用似乎没有引用任何私有 API),但它应该会影响您的设计决策。您现在或将来可能会继承意外行为(如果超类的内部发生某些变化)。导航控制器是很方便的东西,但根据您的需要,您最好自己动手。

另一种方法可能是使用标准导航控制器,但将其 navigationBar 属性设置为隐藏。然后,您可以设计自己的导航栏并将其包含在 XIB 中,其中包含针对您希望执行的任何操作的任何按钮(例如,只需调用 popViewController 的后退按钮)。

编辑:不再鼓励 UINavigationController 的子类化。

【讨论】:

感谢您的回答。我会考虑如何实现自己的导航栏。 这似乎已经改变:“这个类通常按原样使用,但可能在 ios 6 及更高版本中被子类化。”刚刚取自 Apple 在UINavigationController 上的文档。

以上是关于捕捉 UINavigationController 本机后退按钮操作的主要内容,如果未能解决你的问题,请参考以下文章

在 UINavigationController 中未检测到 touchesBegan 和其他触摸事件

关闭 UINavigationController 并呈现另一个 UINavigationController

iOS:如何在现有 UINavigationController 中打开另一个 UINavigationController?

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?