Ich versuche, ein Array nach einem seiner Zeichenfolgenfelder zu filtern.
Sowohl nameLower als auch filterLower haben einen NSString-Wert im Inneren, und dennoch bekomme ich immer wieder:
__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;
}
containsString:
Methode wurde nur in iOS 8 hinzugefügt.containsString:
nicht online dokumentiert ist.Antworten:
Wenn Sie möchten, dass Ihr Code sowohl unter iOS 7 als auch unter iOS 8 funktioniert, sollten Sie stattdessen einen der rangeOfString-Aufrufe verwenden. Wenn der zurückgegebene Bereich eine Länge von Null hat, ist der Teilstring grundsätzlich nicht vorhanden.
/* 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);
Offensichtlich ist es trivial, sich mit rangeOfString in einer Kategorie zu implementieren.
@implementation NSString (Contains) - (BOOL)myContainsString:(NSString*)other { NSRange range = [self rangeOfString:other]; return range.length != 0; } @end
quelle
NSNotFound
anstelle von0
oder vergleichennil
.return range.location != NSNotFound;
Vergleichen Sie rangeOfString mit NSNotFound
NSRange range = [self rangeOfString:other]; if(range.location != NSNotFound){ //do something }
quelle
Verwenden Sie Folgendes:
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 } }
quelle
Stellen Sie für diejenigen, die dies in XLForm festgestellt haben, sicher, dass Sie bei der Installation
XLForm
mit Pods arbeitenplatform :ios, '7' pod 'XLForm'
Es ist bereits behoben in
3.1
von
if ([cellClassString contains:@"/"]) { }
zu
if ([cellClassString rangeOfString:@"/"].location != NSNotFound) { }
quelle
Ich kapsle meine Lösung in YJKit und Sie können - [NSString enthältString:] auch für alte Versionen unter iOS 8 aufrufen.
bool _yj_streq(const char *str1, const char *str2, size_t length) { for (int i = 0; i < length; i++) { if (*str1++ != *str2++) { return false; } } return true; } - (BOOL)yj_containsString:(NSString *)string { NSAssert(string != nil, @"*** -[%@ containsString:] can not use nil argument.", [self class]); size_t len1 = (size_t)self.length; size_t len2 = (size_t)string.length; if (len1 == 0 || len2 == 0 || len1 < len2) { return NO; } const char *str1 = self.UTF8String; const char *str2 = string.UTF8String; for (size_t i = 0; i <= len1 - len2; i++) { const char *substr1 = str1 + i; if (_yj_streq(substr1, str2, len2)) { return YES; } else { continue; } } return NO; }
Hier ist mein Quellcode: https://github.com/huang-kun/YJKit/blob/master/YJKit/Base/Foundation/Categories/Generics/NSString%2BYJCompatible.m
quelle
Schnelle Version der Antwort von w0mbat:
extension NSString { func compatibleContainsString(string: NSString) -> Bool{ let range = self.rangeOfString(string as String) return range.length != 0 } }
quelle