2011-01-30 4 views
0

私は、クエリのparams数の異なるURL持っている:私はTTUrlMapThree20でクエリパラメータを使用してURLを登録する方法はありますか?

[map from:@"myapp://profile*" toViewController:[ProfileController class]]; 

でこのような何かを登録したいと私はの」残りを認識するThree20を希望

myapp://profile?username=1&status=2&title=3 

を私は、クエリのparamsを解析したりできる場所

initWithOriginalUrl:(NSString*) originalUrl 

:URL」のようなものを起動し、いずれか

initWithQueryParams(NSDictionary*) queryParams 

ここで、TTNavigatorが私のURLを認識し、パラメータをマップに解析してから、クエリパラメータを渡すコントローラを呼び出しましたか?

これはサポートされていますか?私はむしろここに示唆されているように、エンコードされたURLをパラメータとして渡すことはしません:Pass URL Question

答えて

1

私はこれを自分自身に答えるつもりです - トリックがありますinitWithNavigatorURLについて知っている - Three20はクエリのパラメータを解析し、マップにメソッドを明示的に設定していない場合は、このメソッドを呼び出し、解析されたパラメータを渡します。だから、解決策は、あなたのマップにこれを追加することです:

[map from:@"myapp://profile" toViewController:[ProfileController class]]; 

と魔法initWithNavigatorUrlメソッドを実装して、あなたのtoViewControllerに

@implementation ProfileController 

- (id)initWithNavigatorURL:(NSURL*)URL query:(NSDictionary*)query { 
    NSLog(@"ProfileController initWithNavigatorUrl %@, %@", URL, query); 
    .... 
3

はい、これを行う方法があります。 URLのターゲットクラスは、例えば、ProfileControllerは、このようにURLを登録している場合:あなたが見ることができるように

[map from:@"myapp://profile?originalURL=(initWithOriginalURL:)" 
    toViewController:[ProfileController class]]; 

originalURLという名前のクエリパラメータの値は、Aの最初の引数として渡されます関数initWithOriginalURL:と呼ばれます。だから、ProfilerControllerで、その関数を宣言:

- (id)initWithOriginalURL:(NSString*)originalURL { 
    // Initialize your controller. For example, you might do this: 
    if (self = [self initWithNibName:nil bundle:nil]) { 
     self.variableHeightRows = YES; 

     self.dataSource = 
      [TTListDataSource dataSourceWithObjects: 
      [TTTableLongTextItem itemWithText:[NSString stringWithFormat:@"Original URL is %@", originalURL]], 
      nil]; 
    } 

    return self; 
} 

だから、あなたが開くことができるURLはmyapp://profile?originalURL=URL_GOES_HEREようになります。インターネット上のURLと同様に、すべてのクエリパラメータをURLエンコードすることが重要です。だからここに上記ProfileControllerを開くコードの例です。この場合は

// any URL goes here -- this is the query parameter we are going to 
// pass as the "originalURL=..." parameter. 
NSString* url = @"http://www.google.com/search?hl=en&q=stack+overflow"; 

// URL-encode it: turn most non-alphanumerics into %XX 
NSString * encodedURL = (NSString *)CFURLCreateStringByAddingPercentEscapes(
    NULL, 
    (CFStringRef)url, 
    NULL, 
    (CFStringRef)@"!*'\"();:@&=+$,/?%#[] ", 
    kCFStringEncodingUTF8); 

// Open the URL 
TTOpenURL([NSString stringWithFormat:@"myapp://profile?originalURL=%@", encodedURL]); 

encodedURLはなってしまうでしょう。

myapp://profile?originalURL=http%3A%2F%2Fwww.google.com%2Fsearch%3Fhl%3Den%26q%3Dstack%2Boverflow 
+0

このソリューションでは、パラメータとして渡された元のURLと新しいURLを使用しています。元のURLを使用してそのパラメータにアクセスする方法を探していました。 –

関連する問題