2014-10-16 71 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