0

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

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

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

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

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

4

1 回答 1

2

Categories are used to add additional methods to the class but not for overriding.

I think you can create a UIViewController subclass that overrides the method you mentioned and use this subclass as the super class of all your view controller so as to eliminate duplicate codes.

Secondly, you can use class_replaceMethod or method_exchangeImplementations to replace / exchange the implementation of the method you mentioned. But it would be dangerous.

于 2012-08-21T08:22:41.960 回答