#objective-c #ios #three20
#objective-c #iOS #three20
Вопрос:
Я знаю, что если сопоставить URL с from:toViewController:
, то при открытии этого URL будет создан новый контроллер представления, и если from:toSharedViewController
используется, то будет использоваться общий экземпляр.
Но, например
[map from:@"tt://tabbar/(initWithString:)" toSharedViewController:[MyTabbarController class]];
TTOpenURL(@"tt://tabbar/string");
Это вызовет нечто подобное
[[MyTabbarController alloc] initWithString:@"string"]
Но что произойдет, если TTOpenURL(@"tt://tabbar/somethingelse")
позже будет вызван in?
Поскольку используется общий объект, будет ли initWithString:
вызываться дважды в одном и том же экземпляре?
Ответ №1:
Ответ: нет. Т.е. init не будет вызываться для уже инициализированного экземпляра, но будет выделен и инициализирован новый экземпляр.
Это связано с тем, что Three20 связывает объект с его полным URL, который в вашем случае является либо «tt: //tabbar/string», либо «tt: // tabbar /somethingelse», так что при запросе TTURLMap
уже существующий объект не будет найден, а будет создан экземпляр нового. По крайней мере, это верно с версии Three20 1.0.3. Но я думаю, что они этого не изменили.
На мой взгляд, механизм общего контроллера должен использоваться в очень специфических случаях, например, для настройки представления, и его не следует рассматривать как своего рода синглтон, реализованный в Three20. Каждый раз, когда я пытался полагаться на это для более «умного» использования TTURLMap, я обнаруживал, что возвращаюсь к контроллеру без общего доступа.
Комментарии:
1. Возможно ли открыть тот же экземпляр и вызвать установщик, такой как
setString:
notinitWithString:
? В противном случае практически невозможно повторно использовать контроллер. Я нашелfrom:toViewController:selector
, но я не уверен, как его использовать2. Вы можете это сделать. Вместо вызова
TTOpenURL
вы также можете использовать[[TTNavigator navigator] viewControllerForURL:@"xxxx"]
, если вы просто хотите получить существующий контроллер.