UIViewControllers中的类别重写方法无效 - 方法从未被调用

时间:2012-08-21 07:02:47

标签: objective-c categories

我有一个iPad 3应用程序,我想只能在landescape模式下查看。我有一些UIViewContoller子类(它是一个非常简单的应用程序),并且在所有这些中我都有以下代码:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight;
}

代码不大,但重复,我想学习在Objective-C中可以避免这种情况的方法。我读到了类别,以及它们如何覆盖它们适用的类/实例中的方法,因此决定尝试。我使用Xcode向导为UIViewController类创建了LandscapeOnly类,并将上述实现移到了它 - 无济于事。我尝试将方法签名添加到头文件中,但这也没有改变任何内容。

这是怎么做到的?如何使用类别覆盖实例方法?

我在这里读到另一个问题,不鼓励使用类别和重写方法,所以也许我一直都错了?实现我想要实现的目标的规范方法是什么?我可以使用一个自定义的UIViewController子类,并让所有其他控制器派生自它,但是只要我有不同要求的控制器,因此这将会中断,因此会有多个基类。在其他语言中,我会使用mixins,我认为Objective-c类别是它们的对应物?

1 个答案:

答案 0 :(得分:2)

Categories用于向类添加其他方法,但不用于覆盖。

我认为您可以创建一个UIViewController子类来覆盖您提到的方法,并将此子类用作所有视图控制器的超类,以消除重复的代码。

其次,您可以使用class_replaceMethodmethod_exchangeImplementations来替换/交换您提到的方法的实现。但这很危险。