关于覆盖导航控制器的后退按钮动作有很多问题,但是每个人都说没有直接的方法可以做到这一点。我通过继承UINavigationController并重写UINavigationBarDelegate方法来实现此目的。但是问题是UINavigationController的接口没有实现UINavigationBarDelegate协议(但是它实现了此方法,因为此代码有效:),并且考虑到这里使用的是未公开的API,我担心该应用将被Apple拒绝。
因此,问题是:您如何看待 private 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
最佳答案
Apple在UINavigationController上的文档:此类不适用于子类化。
尽管此意图并非禁令,并且从技术上讲可能不会使您被拒绝(使用似乎未引用任何 private API),但它应该会影响您的设计决策。您现在或将来有可能继承意外行为(如果 super class 的内部发生了某些变化)。导航控制器很方便,但是根据您的需求,最好自己动手。
一种替代方法是采用标准导航控制器,但将其navigationBar属性设置为hidden。然后,您可以设计自己的导航栏并将其包含在XIB中,其中的任意按钮针对您希望执行的任何操作(例如,后退按钮仅调用popViewController)。
编辑:不再鼓励UINavigationController的子类化。
关于iphone - 捕获UINavigationController native 后退按钮 Action ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8013877/