最近的 question 让我想到了类别冲突,特别是涉及 UIViewControllerRotation
中的 UIViewController.h
类别。此类别包括 shouldAutorotateToInterfaceOrientation:
。如果你想覆盖这个方法(通过一个类别)并让它为每个 UIViewController
运行相同的代码(正如链接的帖子试图完成的那样)那么他们会有两个具有相同方法的类别 - 我读到的东西会导致未定义的行为。
我试了一下,对于 iOS 4.3 中基于 View 的标准应用程序,旋转逻辑回退到默认值,仅纵向旋转,有效地忽略了类别。我的 shouldAutorotateToInterfaceOrientation:
子类中没有定义 UIViewController
方法。有趣的是,当我确实定义了 shouldAutorotateToInterfaceOrientation:
方法并简单地调用了 return [super shouldAutorotateToInterfaceOrientation:]
时,就会调用类别。所以这给我留下了两个问题:
非常感谢任何反馈!谢谢。
最佳答案
如果类别方法的实现存在冲突,会发生什么情况是不确定的。 UIViewController
提供 shouldAutorotateToInterfaceOrientation:
的默认实现,因此您无法通过类别附加自己的实现。
但是,您可以劫持 -[UIViewController shouldAutorotateToInterfaceOrientation:]
并插入您自己的实现。我在 Hijacking with method_exchangeImplementations() 中对此进行了讨论。
这必须非常小心地使用,并且取决于可能会更改的 UIViewController
的某些实现细节。所以对于大多数问题,我不推荐这种方法。通常,如果您想要一个“特殊的旋转 View Controller ”,这就是子类化的目的。您创建 MYSpecialViewController
并从中继承子类。使用劫持(或任何其他将自身动态插入对象模型的机制)将影响系统中的每个 View Controller ,包括 Apple 提供的那些可能会或可能不会对其做出良好 react 的 View Controller 。但是对于某些问题,它是一个非常有用的解决方案。
关于objective-c - 类别冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5267034/