我们刚刚将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:
的参数传递,但这对我们不起作用。
也许我们需要在这里进行更彻底的设计更改。有什么想法吗?
答案 0 :(得分:3)
以下是两个选项:
将所有对象设置为一个对象容器并将其放在全局缓存中,您可以在该缓存中获取该容器的ID,该容器将您编码为url中的字符串。这会在管理这些对象的生命周期时增加一些开销:(
使用网址调用三个20控制器有另一种有用的方法,它涉及一些不同的方法来耦合参数:
你的目标控制器将有另一个这样的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
要记住一些事情: