Three20 - 为共享视图控制器打开URL

3
我知道如果使用from:toViewController:映射URL,那么打开该URL将会创建一个新的视图控制器;如果使用from:toSharedViewController,则会使用一个共享实例。
但是例如:
 [map from:@"tt://tabbar/(initWithString:)" toSharedViewController:[MyTabbarController class]];
 TTOpenURL(@"tt://tabbar/string");

这将会调用类似于的东西。
 [[MyTabbarController alloc] initWithString:@"string"]

如果稍后调用TTOpenURL(@"tt://tabbar/somethingelse"),会发生什么? 由于使用了共享对象,因此initWithString:将在同一实例上调用两次吗?

1个回答

2
答案是:不会。也就是说,init不会在已初始化的实例上调用,但会分配并初始化一个新实例。
这是由于Three20将对象与其完整的URL相关联,你的情况下可能是"tt://tabbar/string"或"tt://tabbar/somethingelse",因此在查询TTURLMap时,不会找到已存在的对象,并且将实例化一个新对象。至少在Three20 1.0.3中是这样的,但我猜他们没有改变这一点。
在我看来,共享控制器机制应该只用于特定情况,比如设置视图,并且不应被视为一种由Three20实现的单例。每当我尝试依赖它来更“聪明”地使用TTURLMap时,我发现自己回到了非共享控制器。

能否打开同一个实例并调用setString:而不是initWithString:? 否则几乎不可能重复使用控制器。我找到了from:toViewController:selector,但我不确定如何使用它。 - Bryan Chen
1
你可以这样做。如果你只想获取现有的控制器,而不是调用TTOpenURL,你也可以使用[[TTNavigator navigator] viewControllerForURL:@"xxxx"] - sergio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接