Отсутствующий селектор из каталога библиотеки Obj-c Three20
-
19-09-2019 - |
Вопрос
Я использую http://github.com/facebook/three20 в моем приложении для iPhone.Я следовал инструкциям по включению фреймворка в свой проект.Я проверил это уже дважды (по рекомендациям людей из группы Google и IRC).Я получаю следующую ошибку, когда какой-либо из кодов Three20 пытается использовать каталогизированный селектор в UIView:
-[TTSearchTextField ancestororself с классом:]:нераспознанный селектор, отправленный экземпляру 0x3a85ee0'
Это исключение срабатывает, когда я прикасаюсь к текстовому полю.
Вот в чем фишка для меня, если я не назначу источник данных TTSearchTextField, это не вызовет ошибку.Итак, по логике вещей, я решил, что это должен быть мой источник данных.
- Я установил точку останова для каждой функции в моем источнике данных.
- Запустил программу, как и ожидалось, был вызван init и вызывались делегаты доступа.
- Нажал на текстовое поле, никаких вызовов к моему источнику данных нет, и возникает исключение во время выполнения.
Я в тупике по этому поводу.У меня никогда раньше не возникало проблем с использованием внешних библиотек с каталогами в них.Я могу предоставить больше информации о настройке проекта, просто спросите о деталях, поскольку там довольно много информации.
Код, который я использую, создает 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
Решение
Я не думаю, что это ваш источник данных. -ancestorOrSelfWithClass:
это метод категории, который расширяет UIView и добавляется в UIViewAdditions.h
.Причина, по которой вы получаете ошибку при добавлении вашего источника данных, вероятно, заключается в том, что какой бы код ни отправлял -ancestorOrSelfWithClass:
сообщение, вероятно, не вызывается, если источник данных не назначен.
При компиляции статических библиотек для включения в приложения iPhone в версии 2.x вам необходимо было добавить -ObjC
к вашим другим флагам компоновщика, чтобы убедиться, что методы категории были связаны с библиотекой.В 3.x, похоже, это не работает должным образом, так что -all_load
необходимо было добавить также к другим флагам компоновщика.