web-dev-qa-db-fra.com

NSString includesString plante

J'essaie de filtrer un tableau en fonction de l'un de ses champs de chaîne.

NameLower et filterLower ont tous deux une valeur NSString, et pourtant je continue à obtenir:

__NSCFString containsString:]: unrecognized selector sent to instance 0x7f876b79e160

-(void) filterFriendsArray:(NSString*)filter {
    [_filteredFriendsArray removeAllObjects];
    for (FacebookUser* user in _friendsArray)
    {
        NSString* nameLower = [user.user.name lowercaseString];
        NSString* filterLower = [filter lowercaseString];
        if ([nameLower containsString:filterLower])
            [_filteredFriendsArray addObject:user];
    }
    _displayedFriendsArray = _filteredFriendsArray;
}
70
Asaf Nevo

Si vous souhaitez que votre code fonctionne sur iOS 7 ainsi que sur iOS 8, vous devez plutôt utiliser l'un des appels rangeOfString. Fondamentalement, si la plage renvoyée a une longueur de zéro, la sous-chaîne n’est pas présente.

/* These methods return length==0 if the target string is not found. So, to check for containment: ([str rangeOfString:@"target"].length > 0).  Note that the length of the range returned by these methods might be different than the length of the target string, due composed characters and such.
*/
- (NSRange)rangeOfString:(NSString *)aString;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange;
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(NSLocale *)locale NS_AVAILABLE(10_5, 2_0);

Évidemment, il est trivial de mettre en œuvre une chaîne contientString dans une catégorie utilisant rangeOfString:

@implementation NSString (Contains)

- (BOOL)myContainsString:(NSString*)other {
  NSRange range = [self rangeOfString:other];
  return range.length != 0;
}

@end
119
w0mbat

comparer la plage de chaînes de chaînes avec NSNotFound

NSRange range = [self rangeOfString:other];
if(range.location != NSNotFound){
    //do something
}
8
Deepak Badiger

Utilisez ce qui suit:  

if (![[NSString class] respondsToSelector:@selector(containsString)])
     {
         //ios 7
         NSRange range = [mystring rangeOfString:other];
         if(range.location != NSNotFound){
           //do something
         }
     }
     else  //for iOS 8 
     {
          if ([mystring containsString: other])
          {
              //do something
          }                             
     }
3
Ram G.

Pour ceux qui ont rencontré cela dans XLForm, assurez-vous que vous installez XLForm à l'aide de pods

platform :ios, '7'
pod 'XLForm'

Il est déjà corrigé dans 3.1

de

if ([cellClassString contains:@"/"]) {

}

à 

if ([cellClassString rangeOfString:@"/"].location != NSNotFound) {

}
0
Ted