2011-06-06 52 views
3

我知道如果使用from:toViewController:映射url,那麼打開該url將創建一個新的視圖控制器,如果使用from:toSharedViewController,則將使用共享實例。Three20 - 共享視圖控制器的打開url

但例如

[map from:@"tt://tabbar/(initWithString:)" toSharedViewController:[MyTabbarController class]]; 
TTOpenURL(@"tt://tabbar/string"); 

這將調用類似

[[MyTabbarController alloc] initWithString:@"string"] 

但究竟會發生什麼,如果TTOpenURL(@"tt://tabbar/somethingelse")在後面叫什麼? 由於使用共享對象,所以initWithString:在同一個實例上被調用兩次?

回答

2

答案是:不。即,init不會在已經初始化的實例上被調用,但是新的實例將被分配和初始化。

這是由於Three20將對象關聯到它的完整URL,在您的情況下,它是「tt:// tabbar/string」或「tt:// tabbar/somethingelse」,這樣在查詢TTURLMap時,沒有已經存在的對象將被找到並且新的對象將被實例化。至少,Three20 1.0.3是這​​樣的。但我想他們沒有改變這一點。

在我看來,共享控制器機制將用於非常特殊的情況下,如設置視圖,不應該被認爲是一種Three20實現的單例。每次我試圖依靠這個來更加「巧妙」地使用TTURLMap時,我發現自己回到了非共享控制器。

+0

是否可以打開同一個實例並調用setter,比如'setString:'not'initWithString:'?否則幾乎不可能重用控制器。我發現'from:toViewController:selector',但我不知道如何使用它 – 2011-06-06 11:23:22

+1

你可以做到這一點。如果你只想獲得現有的控制器,你可以不用調用'TTOpenURL',而使用'[[TTNavigator navigator] viewControllerForURL:@「xxxx」]。 – sergio 2011-06-06 11:27:58

相關問題