7

私はユニバーサル iOS アプリケーション (iPad と iPhone) を作成していますが、2 つのアプリ間で共有できないクラスの名前が非常に長いことに気付きました。

FamilyViewController_iPhone.h/m
FamilyViewControllerA_iPad.h/m

DetailViewControllerB_iPhone.h/m
DetailViewControllerB_iPad.h/m

同様に、これらの内部のクラスには、主に Interface Builder が簡単に使用できるように、完全な名前 (デバイスを含む) があります。

A=iPhone で B=iPad の AControllerA.h と BControllerA.h のようなものを検討しましたが、そのオプションについても興奮していませんでした。

iOS ユニバーサル アプリケーションでのこのようなクラスの永続的な規則は何ですか?または、この必要性を排除する何かが (うまくいけば) 欠けていますか?

4

3 に答える 3

4

このように機能を分離することで、悪い道を進んでいると思います。iPad アプリは明らかに iPhone アプリとは異なる UI 構造とデザインを持つことができますが、可能な限り抽象化を維持することができるのが最善です。

ビュー コントローラーでプラットフォーム名を使用することは避けています。私が持っているだろう:

FamilyViewController.h
FamilyViewController.m
FamilyViewController.xib (which is used for the iPad UI)
FamilyViewController~iphone.xib

iPhone と iPad の両方で信じられないほど類似した機能を使用する可能性が高く、同じではないにしても、多くの重複が残ることになります。

また、ビュー コントローラーをテーブル コントローラーとして機能させることもありません。その機能を別のオブジェクトに保持します。そうすれば、iPhone アプリの異なる画面に 2 つまたは 3 つのテーブルがあり、iPad ではこれら 3 つのテーブルすべてが同じ画面に表示される場合、これらのテーブル コントローラーをそれぞれインスタンス化するだけで、すべてのコードを再利用できます。

于 2011-03-05T04:37:16.910 に答える
2

YourClass.xib と YourClass-iPad.xib で同じクラス YourClass を使用する場合は、私が使用する次のマクロを確認してください。

#define getXIB(s) ( (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? @"" #s "-iPad" :@"" #s )

したがって、クラス自体を使用して適切な XIB ファイルを取得できます。

YourClass * viewController = [[YourClass alloc] initWithNibName:getXIB(YourClass) bundle:nil];
于 2011-07-27T20:34:45.840 に答える
1

これを処理する標準的な方法があるかどうかはわかりません。

1 つの可能性は、クラス クラスターのような戦略を使用することです。FamilyViewController_iPad と FamilyViewController_iPhone が非常に似ている場合は、それらを抽象 FamilyViewController クラスのサブクラスにします。-initWithNibName:bundle: FamilyViewController のメソッドを設定して、アプリが実行されているデバイスに応じて、...iPad または ...iPhone バージョンのインスタンスを返すようにします。したがって、ほとんどのコードでは、FamilyViewController のみを扱います。もちろん、ペン先でサブクラス名を使用する必要がありますが、少なくともコードは読みやすくなります。

于 2011-03-05T03:01:05.733 に答える