2011-12-26 5 views
3

私たちは既存のプロジェクトにThree20を追加しましたが、ルーティングシステムに慣れていく上で問題があります。オブジェクトをパラメータとして持つThree20 URLルーティング

私たちが今持っていることは、特定のアクションがBに発生したときに、私はAでアクションをトリガーできるようにするために、ビューコントローラBのデリゲートとしてAを持つ、ビューコントローラBにビューコントローラAからの移行です。

のは、私は次のようにBを呼び出し、上のボタンを持っているとしましょう:

- (IBAction)buttonAction:(id)sender { 
    id bvc = [[[BViewController alloc] initWithDelegate:self] autorelease]; 
    [self.navigationController pushViewController:bvc animated:YES]; 
} 

は今、代わりにボタンの、私たちは、同じ目的のためにTTStyledText内のリンクを使用したいです。問題は、AビューコントローラのインスタンスをBinitWithDelegate:メソッドに渡す方法がわからないことです。 TTURLMapのパラメータとして文字列を渡す方法を発見しましたが、これはうまくいきません。

多分もっと徹底した設計変更が必要かもしれません。何かご意見は?ここで

答えて

3

2つのオプションです:あなたは親切でオブジェクトコンテナをすべてのオブジェクトを設定して、あなたはあなたが文字列にエンコードし、そのコンテナのIDを取得することができ、グローバル・キャッシュに入れ

  1. url。これは、これらのオブジェクトのライフサイクルを管理するオーバーヘッドのビットを追加する:(

  2. 偶然にを結合する少し異なる方法を含むURLを用いて三台の20コントローラを起動する別の有用な方法があり:

:このようなコントローラを呼び出すことによって、あなたはそれを呼び出す

-(id)initWithNavigatorURL:(NSURL *)URL query:(NSDictionary *)query { 
    self = [super initWithNavigatorURL:URL query:query]; 
    if (self) { 
     self.parameter = [query objectForKey:@"[YOUR PARAMETER NAME]"]; 
    } 
    return self; 
} 

あなたのターゲットコントローラは、このような別のinitメソッドを持っているでしょう

残っているのは、ラベル内のリンクをマッピングして、何とかその派手なTTURLActionを呼び出すことだけです。

これは、スタイル付きラベルをホストするコントローラのTTURLMapを変更することで行います。空想を呼び出すことuserpressedlinkメソッド内

TTNavigator* navigator = [TTNavigator navigator]; 
TTURLMap* map = navigator.URLMap; 
[map from:@"yourapp://someaction" toObject:self selector:@selector(userpressedlink)]; 

:ラベルはこれを追加ホストそのビューコントローラ内

- (void)from:(NSString*)URL toObject:(id)object selector:(SEL)selector; 

そう: three20は、以下の特定のクラスへのマッピングを追加する方法と、セレクタを有していますTTURLAction

覚えておくべきいくつかの事:

  1. 必要にそのマッピングを削除してください(私はviewWillAppearを使ってマッピングを追加し、viewWillDisappearはそれらを削除することをお勧めします)
  2. 各リンクには独自のマッピングがあるので、リンクを区別して差分セレクタにマップすることができます。
関連する問題