2011-01-30 89 views
0

我有不同数量的查询参数的URL:有没有办法在Three20中用查询参数注册url?

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

我想注册像这样与TTUrlMap

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

而且我想Three20承认“的其余部分网址”,要么调用类似:

initWithOriginalUrl:(NSString*) originalUrl 

在那里我可以再解析查询参数或:

initWithQueryParams(NSDictionary*) queryParams 

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

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

回答

1

我要这个回答我 - 关键是了解initWithNavigatorURL - Three20将解析查询参数,如果未在地图中明确设置方法,则调用此方法并将解析的参数传递给它。所以,解决的办法是把它添加到您的地图:

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

并实现你的toViewController

@implementation ProfileController 

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

是的,有一种方法可以做到这一点。如果目标类的URL的是,例如,ProfileController,然后注册的网址是这样的:

[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 
+0

该解决方案使用与作为参数传递原始URL的新URL魔术initWithNavigatorUrl方法。我正在寻找一种方法来使用原始网址并访问其参数。 – 2011-02-10 05:40:53

相关问题