2014-10-16 69 views
70

我想根據其中一個字符串字段來過濾數組。NSString containsString崩潰

兩個nameLower和filterLower具有的NSString值內,但我不斷收到:

__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; 
} 
+46

你在iOS上運行的是否低於8? 'containsString:'方法只在iOS 8中添加。 – 2014-10-16 17:32:27

+6

很遺憾'containsString:'沒有在線記錄。 – 2014-10-16 18:19:07

+0

@IanMacDonald你是對的..作爲回答發佈,所以我可以接受它.. – 2014-10-16 21:51:11

回答

118

如果你希望你的代碼在iOS 7以及iOS 8的工作,你應該使用rangeOfString的一個電話而不是。基本上如果返回的範圍長度爲零,子字符串不在那裏。

/* 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); 

顯然,這是微不足道的實施使用rangeOfString containsString自己在一個類別:

@implementation NSString (Contains) 

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

@end 
+0

在OSX rangeOfString彷彿回到零,不爲0如果字符串不包含 – 2015-04-30 06:35:31

+2

//「在OSX rangeOfString彷彿回到零,不爲0如果字符串不包含」 我最後一次檢查,無等於零。 – w0mbat 2015-05-02 22:55:35

+5

會很高興在編譯時看到這個問題 – user230910 2015-06-21 08:50:34

7

比較與NSNotFound rangeOfString

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

由w0mbat給出的答案斯威夫特版本:

extension NSString { 
    func compatibleContainsString(string: NSString) -> Bool{ 
     let range = self.rangeOfString(string as String) 
     return range.length != 0 
    } 
} 
+0

範圍目前沒有會員長度。 – lostintranslation 2016-07-04 22:22:30

+0

編輯我的答案,顯然字符串的範圍不包含「長度」,但NSString的確。 – 2016-07-07 08:33:20

3

使用下列內容:

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 
      }        
    } 
0

對於那些誰在XLForm遇到這種情況,請確保安裝設備時XLForm使用豆莢

platform :ios, '7' 
pod 'XLForm' 

它已經固定在3.1

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

} 

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

} 
0

我概括了我在YJKit解決方案,您可以打電話 - [的NSString containsString:即使對於老版本,下面的iOS 8

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; 
} 

這裏我的源代碼: https://github.com/huang-kun/YJKit/blob/master/YJKit/Base/Foundation/Categories/Generics/NSString%2BYJCompatible.m

+1

儘管此鏈接可能回答此問題,但最好在此處包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Marusyk 2016-08-05 10:31:39