2011-07-06 1 views
5

私は他の開発者が使用するiOS静的ライブラリを設計しています。このライブラリは、独自のモーダルUIを提供する必要があります。私は、これを達成するためにアプリケーションとこのライブラリとの間のインターフェイスを設計する最も簡単な方法を探しています。私は、iOS 4.0以上をサポートする必要があります。独自のモーダルUIを提供するiOS静的ライブラリを設計する最も簡単な方法は何ですか?

ラフアーキテクチャ

私の静的ライブラリは、一つのクラスと非常にシンプルなAPIを持っています。アプリケーションのAppDelegateは、この1つのクラスをインスタンス化し、通知を受信できるように自身をデリゲートとして設定します。アプリケーションでライブラリにUIが表示されるようにするには、単一のメソッドが呼び出されます。ライブラリがその作業を完了すると、デリゲートプロトコルのメソッドの1つを使用して通知が送信されます。

これを達成するには2つの方法があります。

オプションアプリケーションがそのUIを表示するライブラリを望んでいる1

は、AppDelegateはself.windowに渡し、ライブラリが効果的にUIの完全な所有権を取って、独自のルートビューコントローラを設定します。 UIが終了すると、AppDelegateはAppDelegateに自身のルートビューコントローラを設定し、UIの所有権を取り戻します。

オプション2

ライブラリは、アプリケーションが、それが好きどのビュースタックにプッシュすることができるビューコントローラを公開します。 UIが終了したことをライブラリが通知すると、View Controllerも削除されます。オプション1で

問題

は、アプリケーションを実行しているの真ん中にしながら、ルートビューコントローラを変更する問題がある可能性があります。オプション2を使用すると、任意のコンテキスト(UINavigationControllerのサブビューとしてフル・ウィンドウ・ビュー・コントローラなど)で動作するビュー・コントローラを提供する際に問題が発生することがあります。

両方のオプションのもう1つの問題は、applicationWillResignActive:やapplicationDidBecomeActive:など、AppDelegateが受け取る可能性のある他のUIApplicationDelegate通知です。ライブラリはUIを適切に維持するために通知を処理する必要があります。 AppDelegateは、UIがアクティブなときに、これらをライブラリに渡す必要がありますか?

私が考えていないより良いオプション3がありますか?

答えて

3

は、私はそれを行う方法は次のとおりです。 (あなたが簡単にあなたができない簡単にバンドルリソースのiOS上のフレームワークを作ることができないので)あなたの静的ライブラリでは、あなたのUIViewControllerとあなたがプログラムで必要なすべてのコンテンツのビューを作成します。

UIViewController *controller = [[[UIViewController alloc] initWithNibName: nil bundle: nil] autorelease]; 
UIView *containerView = [[[UIView alloc] initWithFrame: [UIScreen mainScreen].applicationFrame] autorelease]; 
containerView.backgroundColor = [UIColor darkGrayColor]; 

UIWebView *webView = [[[UIWebView alloc] initWithFrame: containerView.bounds] autorelease]; 
webView.delegate = self; 

// ... some other code to setup custom things 

[containerView addSubview: webView]; 

// ... some other code to setup custom things, spinner etc. 

そしてこれは、2つの異なるiOSアプリケーションに埋め込まれたとの両方でうまく動作するようですされての作業静的ライブラリから切り取り、貼り付けられ

[[UIApplication sharedApplication].keyWindow.rootViewController presentModalViewController: myViewController animated: YES]; 

でそれを表示します。これがカバーしないエッジケースがあるかもしれませんが、私はまだヒットしていません:)

+0

このコードをNSObjectクラスに書く必要がありますか? –

+0

これに入れるクラスはすべて、NSObjectの子孫ですObjectiveCコードでなければならないので、私はあなたの質問を理解しているか分からない。これは2年以上経過しているため、まだ有効かどうかはわかりません。 – Dad

+0

あなたのコードがうまくいきました。私のコードでは間違いでした。素晴らしいコードそれは多くの時間を節約.. –

1

デリゲートの代わりにブロックを使用します。あなたのビューは、完了したときに提供されたdismissBlockをプロパティに保存し、呼び出し側はそのブロックから何をする必要があるかを実行する必要があります。あなたは返す必要があるデータを持っていますか?それをブロックの引数にするか、適切にView Controllerからアクセス可能なオブジェクトのプロパティに配置します。

イベントに応答して保存する必要がある状態がある場合は、その情報をいくつかのデータに保存し、データブロックからUIを復元する方法を文書化して提供する方法を提供します。呼び出し側は、望むようにそれを処理できます。

UIがモーダルに表示される正確な方法は、クライアントアプリケーションまででなければなりませんが、実際にはUIをモーダルに表示する必要がある場合は、ホスト環境についてあまり心配する必要はありません。

5

あなたはUIViewControllerを受け入れるようにAPIを設計検討している:

- (void)presentFromViewController:(UIViewController *)presentingViewController 
         animated:(BOOL)animated 
{ 
    [presentingViewController presentModalViewController:myViewController 
               animated:animated]; 
} 

そのように、あなたのライブラリーは、モーダルUIが提示される方法を完全に制御を持っている、とも-dismissViewControllerAnimated:自体ではなく、デリゲートに頼るを呼び出すことができますそうするために。

-applicationWillResignActive:などを気にしないでください。UIApplicationWillResignActiveNotificationなどのライブラリークラスの通知を登録するだけです。ここで

関連する問題