2012-04-01 7 views
1

私は、ストーリーボードや旧式のUINavigationController pushingではなく、TTNavigatorを使いたい人たちと一緒にプロジェクトに取り組んでいます。我々のアプリでは、デリゲートパターンを使ってお互いに通信しているビューコントローラがいくつかあることを除いて、私はうまくいきません。 TTNavigatorを使用しているときにそのパターンを保持する方法がわかりません。出来ますか?Three20's TTNavigatorとデリゲートパターン

私の質問をするもう1つの方法は、TTNavigatorにその宛先ビューコントローラに新しいactionURLを開くように指示しているビューコントローラから宛先ビューコントローラにアクセスできることですか?

たとえば、ユーザーからのイメージを必要とするビューコントローラがあります。それを得るために、ユーザーが画像を取得できるカメラUIを備えた新しいView Controllerを起動します。通常、私は最初のビューコントローラをカメラビューコントローラのデリゲートとして設定します。ユーザがイメージを選択すると、カメラビューコントローラはデリゲートに選択について通知し、デリゲートはイメージを取得してカメラビューコントローラをスタックからポップします。

TTNavigatorは、最初のビューコントローラにカメラビューコントローラとやり取りする機会を与えてくれていないようです。私が見る1つの方法は、最初のView ControllerがTTNavigatorのデリゲートとして自分自身を設定することです。その結果、TTNavigatorはプッシュしようとしているView Controllerを見ていきます。それはこれを処理する最善の方法ですか?

答えて

1

ことは可能ですが、

をお勧めしませんあなたは、「クエリ」にデータを渡すことができます。あなたは確かにあなたの起源のviewControllerを渡して、それを宛先のviewControllerのコンストラクタで結ぶことができます。その疎結合し、うまくいくでしょう。しかし、それはかなりです。

http://three20.info/article/2010-10-06-URL-Based-Navigation#nativeparams

代わりに、あなたは直接viewControllerForURLを使用してTTNavigatorを形成するのViewControllerを取得できますし、そののViewControllerを押してください。またまらないです

私は多くのプロジェクトでTTNavigatorを使用しましたが、最後の実装は価値があったよりもずっと面倒でした。私たちはiPadプロジェクトで動作させようと努力し、常にライブラリと戦った。結論は、iOSアプリはウェブアプリだけではなく、カスタムアプリ内の複数の画面ナビゲーションにURLをマッピングする普遍的な戦略はないということです。各ページがステートレスで構造化されたセマンティックアーキテクチャ(うまくいけば)の中に住んでいるが、豊富なモバイルアプリ、特に複数ペインのiPadアプリでは、これらの詳細は簡単にURLにエンコードされないウェブにとっては理にかなっています。あまり複雑でないナビゲーション管理サブシステムを構築し、必要に応じて明示的なURLをマッピングする方がよいでしょう。

+0

合意。 TTStyledTextはまだかなり有用ですが、全体的に私は今からThree20を明確にしようとします。 – CharlieMezak

0

皮肉なことに、facebook-ios-sdkを使用して、私の3つのアプリのうちの1つにFacebookのサポートを追加する際に、同様の問題が発生しました。私のコントローラはFacebookのURLレスポンスを得ることが期待されていましたが、標準のTTNavigator URLマッピングを使用することは不可能でした。

私は、コントローラ上のFacebookオブジェクトを呼び出して着信URLを渡す方法を見つけなければなりませんでした。 TTNavigatorコントローラスタックを管理している場合は、コントローラ自体以外のどこからでもコントローラにアクセスすることはできません。

コントローラの設定には、アプリケーションデリゲートのプライベートパラメータがあり、TTURLMapのプライベートパラメータが使用されていました。

@class PhotoEditorController; 

@interface PhotoBoothAppDelegate : NSObject <UIApplicationDelegate> { 
    PhotoEditorController* _photoEditorController; 
} 

@property(nonatomic, retain) PhotoEditorController* photoEditorController; 
@end 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
@implementation PhotoBoothAppDelegate 

@synthesize photoEditorController = _photoEditorController; 



/////////////////////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////////////////////// 
#pragma mark - 
#pragma mark UIApplicationDelegate 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:NO]; 

    TTNavigator* navigator = [TTNavigator navigator]; 
    navigator.persistenceMode = TTNavigatorPersistenceModeNone; 

    navigator.window = [[UIWindow alloc] initWithFrame:TTScreenBounds()]; 

    TTURLMap* map = navigator.URLMap; 

    _photoEditorController = [[PhotoEditorController alloc] init]; 

    // Any URL that doesn't match will fall back on this one, and open in the web browser 
    [map from:@"*" toViewController:[TTWebController class]]; 

    [map from:@"tt://photo" toViewController:_photoEditorController transition:UIViewAnimationTransitionCurlUp]; 


    // Before opening the tab bar, we see if the controller history was persisted the last time 
    if (![navigator restoreViewControllers]) { 
     [navigator openURLAction:[TTURLAction actionWithURLPath:@"tt://intro"]]; 
    } 

    return YES; 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    return [[_photoEditorController facebook] handleOpenURL:url]; 
} 

このコードはまだTTNaviagtorを使用しています、しかし、あなたはまだあなたが直接そのパラメータにアクセスすることができることを意味し、コントローラへの参照を持っています。

全体として、私は、TTNavigatorを回避することを強く推奨します。そのiPadのサポートはほとんど存在しないし、壊れています。

関連する問題