0

ランドスケープ モードでのみ表示できるようにしたい iPad 3 アプリがあります。いくつかの UIViewContoller サブクラスがあり (これは非常に単純なアプリです)、それらすべてに次のコードがあります。

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

コードは大きくありませんが、重複しています。Objective-C でこれを回避する方法を学びたいと思います。カテゴリと、それらが適用されるクラス/インスタンスからメソッドをオーバーライドする方法について読んだので、試してみることにしました。Xcode ウィザードを使用して UIViewController クラスの LandscapeOnly カテゴリを作成し、上記の実装をそれに移動しましたが、役に立ちませんでした。ヘッダー ファイルにメソッド シグネチャを追加しようとしましたが、これも何も変わりませんでした。

これはどのように行われますか?カテゴリを使用してインスタンス メソッドをオーバーライドするにはどうすればよいですか?

ここで別の質問で、カテゴリとメソッドのオーバーライドは推奨されないことを読んだので、ずっと間違っているのではないでしょうか? 私が達成したいことを達成する標準的な方法は何ですか? カスタムの UIViewController サブクラスを使用して、他のすべてのコントローラーをそこから派生させることができますが、これは、異なる要件を持つコントローラー、つまり複数の基本クラスを持つとすぐに機能しなくなります。たとえば、他の言語では mixin を使用しますが、Objective-c のカテゴリはそれに相当すると思いますか?

4

1 に答える 1

2

カテゴリは、クラスにメソッドを追加するために使用されますが、オーバーライドには使用されません。

あなたが言及したメソッドをオーバーライドする UIViewController サブクラスを作成し、このサブクラスをすべてのView Controllerのスーパークラスとして使用して、重複コードを排除できると思います。

次に、class_replaceMethodまたはmethod_exchangeImplementationsを使用して、言及したメソッドの実装を交換/交換できます。しかし、それは危険です。

于 2012-08-21T08:22:41.960 に答える