Obj-c Three20图书馆目录中缺少选择器

时间:2010-02-08 17:09:29

标签: iphone objective-c three20 catalog

我在iPhone应用程序中使用http://github.com/facebook/three20。我按照说明将框架包含在我的项目中。我现在已经验证了两次(根据谷歌小组和IRC的人的推荐)。当一些Three20代码尝试在UIView上使用编目选择器时,我收到以下错误:

- [TTSearchTextField ancestorOrSelfWithClass:]:无法识别的选择器发送到实例0x3a85ee0'

触摸文本字段时会触发此异常。

这是我的踢球者,如果我没有为TTSearchTextField分配数据源,它不会触发错误。所以,从逻辑上讲,我认为它必须是我的dataSource。

  1. 我在数据源中的每个函数上都设置了一个断点。
  2. 跑出程序,正如预期的那样调用init并调用了访问者委托。
  3. 点击文本字段,不调用我的dataSource并发生运行时异常。
  4. 我很难过这个。我之前从未遇到过使用带有目录的外部库的问题。我可以提供有关项目设置的更多信息,只是询问具体细节,因为那里有相当多的信息。

    代码我正在使用创建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
    

1 个答案:

答案 0 :(得分:2)

我认为这不是您的数据来源。 -ancestorOrSelfWithClass:是一种扩展UIView的类别方法,并添加到UIViewAdditions.h中。在添加数据源时出现错误的原因可能是,如果数据源未分配,则可能无法调用-ancestorOrSelfWithClass:消息发送的任何代码。

在编译静态库以包含在iPhone应用程序中时,在2.x下,您需要将-ObjC添加到其他链接器标志,以确保将类别方法链接到库中。在3.x中,这似乎无法正常工作,所以 - all_load也需要添加到其他链接器标志。