Pregunta

Estoy usando http://github.com/facebook/three20 en mi aplicación para iPhone . He seguido las instrucciones para incluir el marco en mi proyecto. He verificado que dos veces (en las recomendaciones de la gente en el grupo de Google e IRC). Me sale el siguiente error cuando una parte del código Three20 intentos de utilizar un selector catalogarse en el UIView:

- [TTSearchTextField ancestorOrSelfWithClass:]: Selector no reconocido enviado a la instancia 0x3a85ee0'

Esta excepción se desencadena cuando me toque el campo de texto.

Aquí está el truco para mí, si no se asigna una fuente de datos a la TTSearchTextField que no activa el error. Por lo tanto, lógicamente pensé que debe ser mi fuente de datos.

  1. coloqué un punto de quiebre en cada función en mi fuente de datos.
  2. ejecutó el programa, como era de esperar el inicio fue llamado y los delegados de descriptor de acceso se llama.
  3. golpeó el campo de texto, no hay llamadas a mi dataSource y la excepción en tiempo de ejecución.

Estoy confundido en este caso. Nunca he tenido problemas para usar librerías externas con los Catálogos de ellos antes. Puedo proporcionar más información sobre la configuración del proyecto, sólo hay que preguntar para obtener información específica ya que hay un poco de información del mismo.

Código estoy usando el crear el 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];

Código para mi fuente de datos:

#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
¿Fue útil?

Solución

No creo que sea el origen de datos. -ancestorOrSelfWithClass: es un método categoría que se extiende UIView y se añade en UIViewAdditions.h. La razón por la que está recibiendo el error al añadir la fuente de datos es probable que cualquier código que envía el mensaje -ancestorOrSelfWithClass: probablemente no se conoce si la fuente de datos no está asignado.

Al compilar las bibliotecas estáticas para su inclusión en aplicaciones para el iPhone, bajo 2.x que necesitaba para agregar a sus -ObjC Otras banderas enlazador para hacer que los métodos categoría seguro estaban vinculados a la biblioteca. En 3.x, eso no parece funcionar correctamente, por lo -all_load necesitaba ser añadido también a los enlazadores Otras banderas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top