捕捉 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?