Three20 URL маршрутизация с объектами в качестве параметров - PullRequest
3 голосов
/ 27 декабря 2011

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

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

Допустим, у меня есть кнопка на A, которая вызывает B, как показано ниже:

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

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

Может быть, нам нужно более тщательное изменение дизайна здесь. Есть мысли?

1 Ответ

3 голосов
/ 28 декабря 2011

Вот 2 варианта:

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

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

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

-(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 в контроллере, в котором размещена стилизованная метка. Три20 имеет следующий способ:добавьте отображение к определенному классу и селектору:

- (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 добавить отображение и viewWillИсчезают, чтобы удалить их)
  2. каждая ссылка должна иметь свое собственное сопоставление, чтобы вы могли различать ссылки и сопоставлять их с различными селекторами.
...