我在iPhone应用程序中使用http://github.com/facebook/three20。我按照说明将框架包含在我的项目中。我现在已经验证了两次(根据谷歌小组和IRC的人的推荐)。当一些Three20代码尝试在UIView上使用编目选择器时,我收到以下错误:
- [TTSearchTextField ancestorOrSelfWithClass:]:无法识别的选择器发送到实例0x3a85ee0'
触摸文本字段时会触发此异常。
这是我的踢球者,如果我没有为TTSearchTextField分配数据源,它不会触发错误。所以,从逻辑上讲,我认为它必须是我的dataSource。
我很难过这个。我之前从未遇到过使用带有目录的外部库的问题。我可以提供有关项目设置的更多信息,只是询问具体细节,因为那里有相当多的信息。
代码我正在使用创建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];
我的DataSource代码:
#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
答案 0 :(得分:2)
我认为这不是您的数据来源。 -ancestorOrSelfWithClass:
是一种扩展UIView的类别方法,并添加到UIViewAdditions.h
中。在添加数据源时出现错误的原因可能是,如果数据源未分配,则可能无法调用-ancestorOrSelfWithClass:
消息发送的任何代码。
在编译静态库以包含在iPhone应用程序中时,在2.x下,您需要将-ObjC
添加到其他链接器标志,以确保将类别方法链接到库中。在3.x中,这似乎无法正常工作,所以 - all_load
也需要添加到其他链接器标志。