適切なプロジェクト レイアウトと同様に、UI を非 UI コンポーネントから分離する必要があります。これは単にディスク レイアウトを意味するのではなく (それも意味があります)、コントローラー (C) がモデル (M) を認識し、UI (V) が個別にレンダリングされる MVC アプローチを使用することを意味します。
Key-Value Observing (別名 KVO) を使用してモデルをセットアップし、モデルが起動したときに登録済みのリスナーに通知を送信して更新することができます。XIB を使用してユーザー インターフェイスを生成している場合、オブジェクトを表示ウィジェットにバインドすると、これが発生します。
そのため、iPhone、Mac OS、および (それ以降の) iPad で個別の XIB を使用することができますが、サイズを正しく変更すれば、iPhone と iPad で同じ XIB を使用できます。
最後に、モデルにロジックを挿入する必要がある場合がよくあります (たとえば、メソッドから返される画像を追加するなど)。この場合、iPhone と Mac OS の Image クラスは異なります。これを行うには、次のものを作成できます。
MyModel.m // contains the data, no UI
MyModel+UIImage.m // contains a category for adding the UIImage
MyModel+NSImage.m // contains a category for adding the NSImage
カテゴリは次のようになります。
@interface Host(UIImage)
-(UIImage *)badge;
@end
@implementation MyModel(UIImage)
-(UIImage *)badge
{
if (green)
return [UIImage imageNamed:@"green.png"];
if (red)
return [UIImage imageNamed:@"red.png"];
}
@end
---
@interface Host(NSImage)
-(NSImage *)badge;
@end
@implementation MyModel(NSImage)
-(NSImage *)badge
{
if (green)
return [[NSImage alloc] initWithContentsOfFile: @"green.png"];
if (red)
return [[NSImage alloc] initWithContentsOfFile: @"red.png"];
}
@end
これには、単体テストでモデルをロードするだけで (画像カテゴリをロードせずに) 実行できるという利点がありますが、実行時に画像を処理する必要があるコード (たとえば、View Controller で) はカテゴリ付きのモデルとモデルをロードできます。[model badge]
コンパイルされたプラットフォームに関係なく、透過的な方法でバッジをロードし ます。