以对象作为参数的Three20 URL路由

时间:2011-12-26 20:45:54

标签: ios url-routing three20

我们刚刚将Tri20添加到现有项目中,并且在与路由系统相处时遇到了一些麻烦。

我们现在拥有的是从视图控制器A到视图控制器B的转换,允许A作为视图控制器B的委托,以允许我在B上发生特定操作时触发对A的操作。

假设我在A上有一个按钮,可以调用B,如下所示:

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

现在,我们希望使用TTStyledText中的链接代替按钮,以达到同样的目的。问题是我们不知道如何将A视图控制器实例传递给B的{​​{1}}方法。我们发现了如何将字符串作为initWithDelegate:的参数传递,但这对我们不起作用。

也许我们需要在这里进行更彻底的设计更改。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

以下是两个选项:

  1. 将所有对象设置为一个对象容器并将其放在全局缓存中,您可以在该缓存中获取该容器的ID,该容器将您编码为url中的字符串。这会在管理这些对象的生命周期时增加一些开销:(

  2. 使用网址调用三个20控制器有另一种有用的方法,它涉及一些不同的方法来耦合参数:

  3. 你的目标控制器将有另一个这样的init方法:

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

    你通过这样调用控制器来调用它:

    TTURLAction *action = [[[TTURLAction actionWithURLPath:@"yourapp://yourViewController"] 
                            applyAnimated:YES] 
                           applyQuery:[NSDictionary dictionaryWithObject:[YOUR OBJECT] forKey:@"[YOUR PARAMETER NAME]"]];
    [[TTNavigator navigator] openURLAction:action];
    

    现在你剩下的就是映射标签内的链接以某种方式调用那个花哨的TTURLAction。

    您可以通过更改托管样式标签的控制器中的TTURLMap来完成此操作。 three20有以下方法将映射添加到特定的类和选择器:

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

    所以在托管标签的视图控制器中添加:

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

    在userpressedlink方法中调用花哨的TTURLAction

    要记住一些事情:

    1. 您需要删除该映射(我建议使用viewWillAppear添加映射,并使用viewWillDisappear删除它们)
    2. 每个链接都应该有自己的映射,这样您就可以区分链接并将它们映射到不同的选择器。
相关问题