有没有办法在Three20中注册带查询参数的URL?

时间:2011-01-30 23:37:26

标签: iphone three20 ttnavigator

我有一个包含不同数量的查询参数的网址:

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

我想用TTUrlMap注册这样的东西

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

我希望Three20能够识别“网址的其余部分”并调用类似的内容:

initWithOriginalUrl:(NSString*) originalUrl

然后我可以解析查询参数或:

initWithQueryParams(NSDictionary*) queryParams 

TTNavigator已识别我的网址,将params解析为地图然后调用我的控制器传递查询参数?

支持吗?我宁愿不将编码的url作为param传递,如下所示:Pass URL Question

2 个答案:

答案 0 :(得分: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;
}

因此,您可以打开的网址看起来像myapp://profile?originalURL=URL_GOES_HERE。请注意,与Internet上的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

答案 1 :(得分:1)

我将自己回答这个问题 - 诀窍是了解initWithNavigatorURL - 如果您没有在地图中明确设置方法,则Three20将解析您的查询参数,调用此方法并将解析的参数传递给它。因此,解决方案是将其添加到您的地图中:

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

并在toViewController

上实现magic initWithNavigatorUrl方法
@implementation ProfileController

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