1

私は、ストーリーボードや昔ながらのUINavigationControllerプッシュではなく、TTNavigatorを使用したいという人々と一緒にプロジェクトに取り組んでいます。私のアプリの一部のビューコントローラーがデリゲートパターンを使用して相互に通信していることを除いて、私は問題ありません。TTNavigatorの使用中にそのパターンを保持する方法がわかりません。出来ますか?

私の質問をする別の方法は次のとおりです。TTNavigatorにその宛先ViewControllerへの新しいactionURLを開くように指示しているViewController内から宛先ViewControllerにアクセスすることは可能ですか?

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

TTNavigatorは、私の最初のViewControllerにCameraViewControllerと対話する機会を与えていないようです。私が見る1つの方法は、最初のView Controllerが自分自身をTTNavigatorのデリゲートとして設定することです。これにより、TTNavigatorは、プッシュしようとしているViewControllerをのぞき見することができます。これを処理するための最良の方法ですか?

4

2 に答える 2

1

可能ですが、お勧めしません

「クエリ」でデータを渡すことができます。確かに、元のviewControllerを渡して、それを宛先のviewControllerのコンストラクターに接続することができます。その緩く結合され、うまく機能します。しかし、それはきれいではありません。

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

または、viewControllerForURL:を使用してTTNavigatorから直接viewControllerを取得し、そのviewControllerをプッシュすることもできます。また、きれいではありません

私は多くのプロジェクトでTTNavigatorを使用しましたが、最後の実装はそれが価値があるよりもはるかに厄介でした。私たちはそれをiPadプロジェクトで動作させることを試み、常にライブラリと戦いました。つまり、iOSアプリは単なるWebアプリではなく、カスタムアプリ内の複数の画面ナビゲーションにURLをマッピングするための普遍的な戦略はありません。各ページがステートレスで構造化されたセマンティックアーキテクチャ内に存在するWebには最適ですが(うまくいけば)、リッチモバイルアプリ、特にマルチペインiPadアプリでは、これらの詳細をURLに簡単にエンコードすることはできません。それほど複雑でないナビゲーション管理サブシステムを構築し、必要に応じて明示的なURLをマッピングすることをお勧めします。

于 2012-05-30T16:53:03.407 に答える
0

皮肉なことに、facebook-ios-sdk私のthree20アプリの1つにFacebookサポートを追加するためにを使用しているときに、同様の問題が発生しました。私のコントローラーはFacebookのURL応答を受け取ることを期待していましたが、標準のTTNavigatorURLマッピングを使用することはできませんでした。

コントローラー上の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のサポートはほとんど存在せず、壊れています。

于 2012-04-03T15:50:14.067 に答える