0

さまざまな数のクエリ パラメータを持つ URL があります。

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

このようなものをTTUrlMapに登録したいと思います

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

そして、Three20 に「URL の残りの部分」を認識させ、次のようなものを呼び出してもらいたいと思います。

initWithOriginalUrl:(NSString*) originalUrl

次に、クエリパラメーターを解析できます。または:

initWithQueryParams(NSDictionary*) queryParams 

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

これはサポートされていますか? ここで提案されているように、エンコードされた URL をパラメーターとして渡したくありません: Pass URL Question

4

2 に答える 2

3

はい、これを行う方法があります。たとえば、URL の対象クラスが の場合、ProfileController次のように URL を登録します。

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

ご覧のとおり、という名前のクエリ パラメータの値はoriginalURL、最初の引数として という関数に渡されます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
于 2011-02-02T06:56:20.680 に答える
1

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

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

toViewController に魔法の initWithNavigatorUrl メソッドを実装します

@implementation ProfileController

- (id)initWithNavigatorURL:(NSURL*)URL query:(NSDictionary*)query {
    NSLog(@"ProfileController initWithNavigatorUrl %@, %@", URL, query);  
    ....
于 2011-02-10T05:53:31.353 に答える