2011-12-26 1 views
3

Мы только что добавили Three20 к нашему существующему проекту и испытываем определенные трудности, чтобы ладить с его системой маршрутизации.Трассировка URL-адресов Three20 с объектами как параметры

Что мы имеем сейчас это переход от контроллера представления A к контроллеру вида B, имеющее A в качестве делегата от контроллера представления B, чтобы позволить мне вызвать действие на А, когда определенное действие происходит на B.

Скажем, у меня есть кнопка на А, B вызывает следующий вид:

- (IBAction)buttonAction:(id)sender { 
    id bvc = [[[BViewController alloc] initWithDelegate:self] autorelease]; 
    [self.navigationController pushViewController:bvc animated:YES]; 
} 

Теперь, вместо кнопки, мы хотим использовать ссылку в TTStyledText для той же цели. Проблема в том, что мы не знаем, как передать экземпляр диспетчера представлений A на метод BinitWithDelegate:. Мы обнаружили, как передавать строки в качестве параметров для TTURLMap, но это не сработает для нас.

Возможно, нам нужно более тщательное изменение дизайна здесь. Есть предположения?

ответ

3

Здесь 2 вариант:

  1. установить все ваш объект в виде объекта контейнер и поместите его в глобальном кэше, где вы можете получить идентификатор для этого контейнера, который вы закодировать в строку в url. Это было бы добавить немного накладных расходов в управлении жизненным циклом этих объектов :(

  2. Существует еще один полезный способ вызова три контроллера 20 с помощью URL-адресов, который включает в себя несколько иной способ связывания с paramters:

Ваш целевой контроллер будет иметь другой метод инициализации, как это:

-(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

несколько вещь, чтобы помнить:

  1. вам нужно удалите это сопоставление (я предлагаю viewWillAppear добавить отображение и viewWillDisappear для их удаления).
  2. Каждая ссылка должна иметь собственное сопоставление, чтобы вы могли различать ссылки и сопоставлять их с разными селекторами.
Смежные вопросы