Three20 — открыть URL для общего контроллера представления

#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: not initWithString: ? В противном случае практически невозможно повторно использовать контроллер. Я нашел from:toViewController:selector , но я не уверен, как его использовать

2. Вы можете это сделать. Вместо вызова TTOpenURL вы также можете использовать [[TTNavigator navigator] viewControllerForURL:@"xxxx"] , если вы просто хотите получить существующий контроллер.