Как правильно использовать NSObject для URL с Three20 - PullRequest
1 голос
/ 21 апреля 2010

По сути, я сопоставляю свои контроллеры для принятия класса адресов, передаваемых в контроллер страницы перечисления. Что сделано здесь:

[map from:@"tt://listingPage/(initWithResult:)" toViewController:[ListingPageController class]];
[map from:[Address class] name:@"result" toURL:@"tt://listingPage/(initWithResult:)"];

Этот URL используется в моем элементе таблицы, который заполняется в источнике данных:

for (Address *result in [(id<SearchResultsModel>)self.model results]) {
      NSString* url = [result URLValueWithName:@"result"];
      TTTableImageItem* tii = [TTTableMessageItem itemWithTitle:[result addressText] 
                                            caption:[result addressText]
                                            text:[result subText] 
                                            imageURL:[result image] 
                                            URL:url];
    [self.items addObject:tii];
}

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

1 Ответ

0 голосов
/ 16 мая 2012

Three20 URL Based Navigation Guide

[map from:[Address class] name:@"result" toURL:@"tt://listingPage/(initWithResult:)"];

Ваша проблема в том, что ваш код пытается вызвать метод (initWithResult:) в экземпляре [Address class].

Вместо этого вам нужно извлечь параметр Result из экземпляра Address и использовать его для формирования вашего URL.

Пример:

@interface ListingPageController : UIViewController
    - (id)initWithResult:(NSNumber *)resultId;
@end

@interface Address : NSObject
    @property (nonatomic, copy) NSNumber *resultId;
@end

в этом случае вы хотите передать resultId из Address на ваш initWithResult: вызов ListPageController.

[map from:[Address class] name:@"result" toURL:@"tt://listingPage/(resultId)"];   
[map from:@"tt://listingPage/(initWithResult:)" toViewController:[ListingPageController class]]; 

Обратите внимание, что нет двоеточия в (resultId) - поскольку это вызов метода получения свойства.

В следующем примере:

Address *result = [[[Address alloc] init] autorelease];
result.resultId = [NSNumber numberWithInt:12345];
NSString* url = [result URLValueWithName:@"result"];
[[TTNavigator navigator] openURLAction:[TTURLAction actionWithURLPath:url]];

Сначала будет преобразовано result в URL tt://listingPage/12345, а затем откроется этот URL, который будетпо очереди звоните ListingPageController initWithResult:12345.

...