2

私はCocoaアプリを作成しようとしていますが、いつの日かそれをiPadやiPhoneに簡単に移植できるようにしたいと思っています。これを事前に計画するにはどうすればよいですか?

すべてのNIBをやり直して、おそらく別のワークフローを設計する必要があることはわかっています。

しかし、コードはどうですか?すべてのNSsomethingをUIsomethingに置き換えるだけでは、うまくいきませんよね?後で自分の足を撃たないようにするためのヒントはありますか?

ありがとうございました!

(iPad-SDKはNDAの下にあります。この質問のために、私がiPhoneについて尋ねたと仮定します。OK?または、より大きな画面のiPhoneを考えてください。)

4

3 に答える 3

5

アプリでModel-View-Controller の分離を厳密に維持するようにしてください。特にモデルは、コントローラーやビューに依存するべきではありません。

iPhone/iPod touch/iPad への移植では、コントローラのほとんどまたはすべて、および NSView と NSCell のすべてを置き換える必要があります。CALayer サブクラスがある場合は、それを保持できるはずです。条件付きコンパイルで 1 つまたは 2 つのコントローラーを再利用できる可能性があります。ほとんどのコントローラーが両方で機能し、一部の部分が Mac でのみ機能する場合、または両方で機能するが完全に異なる API を使用している場合です。そして、モデル全体を変更しないでおくことができるはずです。

おそらく、iPhone 開発者が警告できる具体的な落とし穴がいくつかありますが、これは、ある環境から別の環境への移行に適用される一般的な規則です。(別の環境移行の例としては、xcodebuild、packagemaker、ibtool など、1 つまたは複数のコマンドライン ツールに相当するものや、アプリを補完するものを作成することがあります)。

また、どの Foundation クラスが Mac および iPhone 専用であるかを示す図については、Foundation フレームワークのリファレンスの概要を参照してください。

于 2010-01-28T01:42:55.213 に答える
4

多くのライブラリは、デスクトップの Cocoa ライブラリと比較して、Cocoa Touch でもサポートされていません。AppKit と UIKit の違いを考慮する必要があります。また、Objective-C は iPhone でのガベージ コレクションを許可しません。iPhone にのみ存在し、デスクトップには存在しない多くのタッチ イベントがあります。iPhone の開発は、電話が非常に個人的なデータに結び付けられた非常に個人的なデバイスであるという事実により、はるかに制限的です。

より良い比較のためにこれらのスライドをチェックしてください: http://www.slideshare.net/lukhnos/between-cocoa-and-cocoa-touch-a-comparative-introduction

于 2010-01-28T00:56:45.527 に答える
2

適切なプロジェクト レイアウトと同様に、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]コンパイルされたプラットフォームに関係なく、透過的な方法でバッジをロードし ます。

于 2010-01-28T10:09:10.577 に答える