Question

J'utilise http://github.com/facebook/three20 dans mon application iPhone . J'ai suivi les instructions d'inclure le cadre dans mon projet. Je l'ai vérifié deux fois maintenant (les recommandations de personnes sur le groupe Google et IRC). Je reçois l'erreur suivante quand une partie du code Three20 tente d'utiliser un sélecteur cataloguée sur le UIView:

- [TTSearchTextField ancestorOrSelfWithClass]: sélecteur non reconnu envoyé à l'instance 0x3a85ee0'

Cette exception est déclenchée lorsque je touche le champ de texte.

Voici le kicker pour moi, si je ne cède pas à la source de données TTSearchTextField ne déclenche pas l'erreur. Donc, logiquement, je pensais que ce doit être mon dataSource.

  1. Je mis un point d'arrêt sur toutes les fonctions dans ma source de données.
  2. lancé le programme, comme prévu init a été appelé et les délégués accesseurs a été appelé.
  3. tapota le champ de texte, aucun appel à mon dataSource et l'exception d'exécution se produit.

Je suis perplexe sur celui-ci. Je ne l'ai jamais eu des problèmes à l'aide libs externes avec des catalogues en eux avant. Je peux fournir plus d'informations sur la configuration du projet, il suffit de demander pour plus de détails car il est tout à fait un peu d'information là-bas.

code J'utilise le créer le 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];

Code pour mon 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
Était-ce utile?

La solution

Je ne pense pas que c'est votre source de données. -ancestorOrSelfWithClass: est une méthode de catégorie qui se prolonge UIView et est ajouté en UIViewAdditions.h. La raison pour laquelle vous obtenez l'erreur lors de l'ajout de votre source de données est probablement que quel que soit le code envoie le message -ancestorOrSelfWithClass: est probablement pas appelé si la source de données est sans affectation.

Lors de la compilation des bibliothèques statiques pour l'inclusion dans les applications iPhone, sous 2.x vous avez besoin d'ajouter -ObjC à vos autres drapeaux Linker pour rendre les méthodes de catégorie sûres étaient liées dans la bibliothèque. Dans 3.x, cela ne semble pas fonctionner correctement, si nécessaire -all_load à ajouter ainsi aux autres drapeaux Linker.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top