ios - 我如何通过带有非字母字符的名字过滤 NSMutableArray

标签 ios iphone objective-c core-data ios5

我想过滤数组,其中名称以非字母字符开头。我想在 TableView 的不同部分下显示firstName以非字母字符开头的联系人。我尝试了下面的代码,但它崩溃了,请在下面查找原因:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT(firstName BEGINSWITH[c] %@)",arrIndex]; //where arrIndex is the array of alphabetical characeters.
  NSArray  *arrContacts = [arrayTotalContacts filteredArrayUsingPredicate:predicate];

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法使用非字符串的内容执行子字符串操作(lhs = iPhone rhs =( A, 乙, C, D、 乙, F, G, H, 我, J, 克, L, 米, 尼, 哦, 普, 问, , 小号, 吨, 你, 五、 瓦, X, 是, Z ))'

arrayTotalContacts 具有以下数据:

(
{
    firstName = iPhone;
    lastName = "";
},
{
    firstName = Madhu;
    lastName = "";
},
{
    firstName = "Swa";
    lastName = "";
},
{
    firstName = TechV;
    lastName = "";
},
{
    firstName = Vedika;
    lastName = Vt;
}
)

最佳答案

您可以将正则表达式与 Core Data 谓词结合使用:

[NSPredicate predicateWithFormat:@"NOT (firstName MATCHES %@)", @"^[A-Za-z].*"]

其中 ^[A-Za-z].* 是所有以 A-Z 或 a-z 开头的字符串的正则表达式。 要使其也适用于外语字母(例如“Ä”),请使用 Unicode 属性名称:

[NSPredicate predicateWithFormat:@"NOT(firstName MATCHES %@)", @"^\\p{Letter}.*"]

这里 ^\\p{Letter}.* 是所有以字母开头的字符串的正则表达式。

但是如果这是针对 TableView ,您最好使用获取结果 Controller 及其 sectionNameKeyPath 参数。参见此处的示例:

有关如何根据首字母对 TableView 进行分组的一些示例。它应该是 可以修改代码以将所有不以字母开头的名称分组为 一个单独的组。

关于ios - 我如何通过带有非字母字符的名字过滤 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20539909/

相关文章:

ios - HMSegmentedControl 在 Swift 中将分段控件绑定(bind)到 ScrollView ?

iphone - 如何检测 iPhone 6 设备的运动? (确定 iPhone 设备是否移动 - x、y、z 上的最小可能运动-)

objective-c - iPad 上画线的奇怪问题

javascript - iPhone safari 底部栏

ios - 在 Xcode cocos2d 中添加多个物理对象时遇到问题

objective-c - 有没有一种简单的方法可以向后迭代 NSArray?

ios - 如何解决 NULL cString 崩溃

ios - ld : entry point (_main) undefined. 架构 x86_64:Xcode 9

iphone - CGImageCreateWithImageInRect 没有正确裁剪

iphone - 如何通过wifi连接玩游戏?