Domanda

http://github.com/facebook/three20 nella mia applicazione iPhone . Ho seguito le istruzioni per includere il quadro nel mio progetto. Ho verificato che due volte (alle raccomandazioni di persone sul gruppo Google e IRC). Ottengo il seguente errore quando una parte del codice Three20 tenta di utilizzare un selettore Catalogato sul UIView:

- [TTSearchTextField ancestorOrSelfWithClass:]: selettore non riconosciuto inviato ad esempio 0x3a85ee0'

Questa eccezione viene attivato quando mi tocco il campo di testo.

Ecco il kicker per me, se non si assegna un DataSource per l'TTSearchTextField non fa scattare il l'errore. Quindi, logicamente ho pensato che deve essere la mia dataSource.

  1. ho messo un punto di interruzione su ogni funzione nella mia fonte di dati.
  2. ha eseguito il programma, come previsto init è stato chiamato e delegati accessor è stato chiamato.
  3. e toccato il campo di testo, nessuna chiamata al mio DataSource e l'eccezione di runtime si verifica.

Sono perplesso su questo. Non ho mai avuto problemi con le librerie esterne con Cataloghi in loro prima. Posso fornire maggiori informazioni sulla configurazione del progetto, basta chiedere per le specifiche dato che c'è un bel po 'di informazioni là.

Codice Sto utilizzando il creare il 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];

Codice per il mio 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
È stato utile?

Soluzione

Non credo che sia l'origine dati. -ancestorOrSelfWithClass: è un metodo di categoria che si estende UIView, che si aggiunge a UIViewAdditions.h. Il motivo che stai ricevendo l'errore quando si aggiunge l'origine dati è probabilmente che qualunque sia il codice invia il messaggio -ancestorOrSelfWithClass: probabilmente non viene chiamato se l'origine dati non è assegnato.

Quando si compila le librerie statiche per l'inclusione nelle applicazioni per iPhone, sotto 2.x avevi bisogno di aggiungere ai tuoi -ObjC Altre Bandiere Linker per assicurarsi che i metodi di categoria sono state collegate in biblioteca. In 3.x, che non sembra funzionare correttamente, in modo -all_load doveva essere aggiunto anche per le Altre Bandiere Linker.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top