반응형
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;
}
코드가 iOS 7 및 iOS 8에서 작동하도록하려면 대신 rangeOfString 호출 중 하나를 사용해야합니다. 기본적으로 반환 된 범위의 길이가 0이면 하위 문자열이 없습니다.
/* 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
rangeOfString을 NSNotFound와 비교
NSRange range = [self rangeOfString:other];
if(range.location != NSNotFound){
//do something
}
다음을 사용하십시오.
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
}
}
XLForm 에서 이것을 만난 사람들은 XLForm
포드를 사용하여 설치할 때 확인하십시오.
platform :ios, '7'
pod 'XLForm'
이미 고정되어 있습니다 3.1
...에서
if ([cellClassString contains:@"/"]) {
}
...에
if ([cellClassString rangeOfString:@"/"].location != NSNotFound) {
}
내 솔루션을 YJKit에 캡슐화하고 iOS 8 이하의 이전 버전에서도-[NSString containsString :]을 호출 할 수 있습니다.
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;
}
Here is my source code: https://github.com/huang-kun/YJKit/blob/master/YJKit/Base/Foundation/Categories/Generics/NSString%2BYJCompatible.m
Swift version of the answer given by w0mbat:
extension NSString {
func compatibleContainsString(string: NSString) -> Bool{
let range = self.rangeOfString(string as String)
return range.length != 0
}
}
참고URL : https://stackoverflow.com/questions/26410420/nsstring-containsstring-crashes
반응형
'Program Tip' 카테고리의 다른 글
DIV의 "위치"속성의 기본값은 무엇입니까? (0) | 2020.11.01 |
---|---|
NPM은 .gitignore에 나열된 파일을 무시합니까? (0) | 2020.11.01 |
C 부동 소수점 리터럴을 double이 아닌 부동 소수점으로 만듭니다. (0) | 2020.11.01 |
XML에서 요소 또는 속성을 사용해야합니까? (0) | 2020.11.01 |
한 분기를 다른 분기처럼 만드는 git 명령 (0) | 2020.11.01 |