捕获UINavigationController本机后退按钮操作

时间:2011-11-04 18:08:45

标签: iphone ios xcode cocoa-touch

关于覆盖导航控制器的后退按钮操作有很多问题,但是每个人都说没有直接的方法来执行此操作。我通过继承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

1 个答案:

答案 0 :(得分:1)

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

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

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

编辑:不再鼓励对UINavigationController进行子类化。