Отсутствует селектор из каталога библиотеки Obj-c Three20 - PullRequest
1 голос
/ 08 февраля 2010

Я использую http://github.com/facebook/three20 в своем приложении для iPhone.Я следовал инструкциям, чтобы включить фреймворк в мой проект.Я уже дважды проверил это (по рекомендации людей из группы Google и IRC).Я получаю следующую ошибку, когда некоторые из кода Three20 пытаются использовать каталогизированный селектор на UIView:

- [TTSearchTextField ancestorOrSelfWithClass:]: нераспознанный селектор, отправленный экземпляру 0x3a85ee0 '

Это исключениесрабатывает, когда я касаюсь текстового поля.

Вот для меня кикер, если я не назначаю источник данных для TTSearchTextField, он не вызывает ошибку.Итак, логически я решил, что это должен быть мой источник данных.

  1. Я установил точку останова для каждой функции в моем источнике данных.
  2. Запустил программу, как и ожидалось, был вызван init и делегаты доступа.
  3. Прикоснулся к текстовому полю, никаких вызовов к моему источнику данных и исключение во время выполнения не происходит.

Я нахожусь в тупике на этом.У меня никогда не было проблем с использованием внешних библиотек с каталогами в них.Я могу предоставить больше информации о настройке проекта, просто спросите об особенностях, поскольку там довольно много информации.

Код Я использую код создания TTSearchTextField:

// setup Country
self.searchFieldCountry = [[TTSearchTextField alloc]initWithFrame:CGRectMake(156, 145, 146, 37)];
self.searchFieldCountry.borderStyle = UITextBorderStyleRoundedRect;
self.searchFieldCountry.placeholder = @"Country";
self.searchFieldCountry.autocapitalizationType = UITextAutocapitalizationTypeNone;
OLLocationSearchDataSource *ds = [[OLLocationSearchDataSource alloc]init];
self.searchFieldCountry.dataSource = ds;
[self.view addSubview:self.searchFieldCountry];
[ds release];

Код длямой источник данных:

#import "OLLocation.h"
#import "AppSession.h"

@implementation OLLocation

@synthesize locationData = _locationData;

@synthesize locationMode,country,region;

- (NSMutableArray*)delegates {
    if (!_delegates) {
        _delegates = TTCreateNonRetainingArray();
    }
    return _delegates;
}

- (BOOL)isLoadingMore {
    return NO;
}

- (BOOL)isOutdated {
    return NO;
}

- (BOOL)isLoaded {
    return !!_AllLocationData;
}

- (BOOL)isLoading {
    return NO;
}

- (BOOL)isEmpty {
    return !_AllLocationData.count;
}

- (void)load:(TTURLRequestCachePolicy)cachePolicy more:(BOOL)more {
}

- (void)invalidate:(BOOL)erase {
}

- (void)cancel {
    // cancel a search if possible
}

- (void)loadNames {
    _AllLocationData = [[AppSession getAppSession] getCountries];
}

- (void)search:(NSString*)text {
    [self cancel];

    self.locationData = [NSMutableArray array];

    if (text.length) {
        text = [text lowercaseString];
        for (NSString* name in _AllLocationData) {
            if ([[name lowercaseString] rangeOfString:text].location == 0) {
                [_locationData addObject:name];
            }
        }
    }
}

- (void)dealloc {
    [super dealloc];
}

@end

@implementation OLLocationSearchDataSource

@synthesize locations = _locations;

-(id)init {
    if (self = [super init]) {
        _locations = [[OLLocation alloc] init];
        _locations.locationMode = OLLocationModeCountry;
        self.model = _locations;
    }
    return self;
}

-(void)dealloc {
    TT_RELEASE_SAFELY(_locations);
    [super dealloc];
}

///////////////////////////////////////////////////////////////////////////////////////////////////
// TTTableViewDataSource

- (void)tableViewDidLoadModel:(UITableView*)tableView {
    self.items = [NSMutableArray array];

    for (NSString* name in _locations.locationData) {
        TTTableItem* item = [TTTableTextItem itemWithText:name URL:@"http://google.com"];
        [_items addObject:item];
    }
}

- (void)search:(NSString*)text {
    [_locations search:text];
}

- (NSString*)titleForLoading:(BOOL)reloading {
    return @"Searching...";
}

- (NSString*)titleForNoData {
    return @"No names found";
}

@end

1 Ответ

2 голосов
/ 09 февраля 2010

Не думаю, что это ваш источник данных.-ancestorOrSelfWithClass: - это метод категории, который расширяет UIView и добавляется в UIViewAdditions.h.Причина, по которой вы получаете сообщение об ошибке при добавлении источника данных, заключается в том, что любой код, отправляющий сообщение -ancestorOrSelfWithClass:, вероятно, не вызывается, если источник данных не назначен.

При компиляции статических библиотек для включения в iPhoneприложениям под 2.x вам нужно было добавить -ObjC к вашим другим флагам компоновщика, чтобы убедиться, что методы категории были связаны с библиотекой.В 3.x это, похоже, не работает должным образом, поэтому необходимо добавить all_load также и к другим флагам компоновщика.

...