Frage

Ich bin mit http://github.com/facebook/three20 in meiner iPhone-Anwendung . Ich habe die Anweisungen befolgt, den Rahmen in meinem Projekt einzubeziehen. Ich habe es jetzt zweimal überprüft (an den Empfehlungen von Menschen auf der Google-Gruppe und IRC). Ich erhalte die folgende Fehlermeldung, wenn ein Teil des Three20 Code versucht, eine katalogisierte Selektor auf der UIView zu verwenden:

- [TTSearchTextField ancestorOrSelfWithClass:]: Unbekannter Selektor zum Beispiel 0x3a85ee0' gesendet

Diese Ausnahme wird ausgelöst, wenn ich das Textfeld berühren.

Hier ist der Kicker für mich, wenn ich an die TTSearchTextField keine Datenquelle zuweisen es nicht den Fehler auslöst. So logisch dachte ich, es ist meine Datasource sein muss.

  1. Ich legte einen Haltepunkt zu jeder Funktion in meiner Datenquelle.
  2. Ran das Programm, wie erwartet wurde die init genannt und die Accessor Delegierten aufgerufen wurde.
  3. tippte auf das Textfeld, keine Anrufe auf meine Datasource und die Laufzeitausnahme auftritt.

Ich bin auf dieser stumped. Ich hatte noch nie Probleme mit externen Libs mit Katalogen in ihnen vor. Ich kann mehr Informationen über das Projekt-Setup zur Verfügung stellen, nur für Einzelheiten fragen, da es einiges an Informationen gibt.

-Code Ich bin mit der der TTSearchTextField erstellen:

// 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];

-Code für meine 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
War es hilfreich?

Lösung

Ich glaube nicht, es ist Ihre Datenquelle. -ancestorOrSelfWithClass: ist eine Kategorie, Methode, die UIView und hinzugefügt wird in UIViewAdditions.h erstreckt. Der Grund, warum Sie die Fehler sind immer, wenn Ihre Datenquelle hinzugefügt ist wahrscheinlich, dass unabhängig von Code sendet die -ancestorOrSelfWithClass: Nachricht wird wahrscheinlich nicht aufgerufen, wenn die Datenquelle nicht zugewiesen ist.

Beim Kompilieren statische Bibliotheken für die Aufnahme in iPhone-Anwendungen, unter 2.x Sie benötigt -ObjC zu Ihrem Anderen Linker Flags hinzuzufügen in die Bibliothek zu machen wurden sicher Kategorie Methoden verknüpft. In 3.x, das scheint nicht richtig funktioniert, so -all_load als auch auf den anderen Linker Flags wird Bedarf hinzugefügt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top