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;
}
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
comparer la plage de chaînes de chaînes avec NSNotFound
NSRange range = [self rangeOfString:other];
if(range.location != NSNotFound){
//do something
}
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
}
}
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) {
}