【问题标题】:How can i filter NSMutableArray by firstName with non-alphabetical characters如何使用非字母字符按名字过滤 NSMutableArray
【发布时间】:2013-12-30 15:39:04
【问题描述】:

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

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 = ( 一种, 乙, C, D, 乙, F, G, H, 一世, Ĵ, ķ, 大号, 米, N, 哦, 磷, 问, R, 年代, 吨, 你, 五, W, X, 是的, Z ))'

arrayTotalContacts 有以下数据:

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

【问题讨论】:

  • 使用数据源编辑您的问题。
  • @Reformer:我用数据编辑了问题。

标签: ios iphone objective-c core-data ios5


【解决方案1】:

您可以将正则表达式与 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}.* 是所有以字母开头的字符串的正则表达式。

但如果这是用于表格视图,您最好使用获取的结果控制器 及其sectionNameKeyPath 参数。例如,请参见此处:

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

【讨论】:

  • 这对我来说很好用,但如果名称为空,我不会在结果中获得该对象,我希望结果中出现该对象,我该如何解决?
  • @PalchuriSudheerKumar:我已经更新了答案,它现在应该也可以使用空字符串了。
  • 完美。工作正常。谢谢你,马丁。
【解决方案2】:

试试这个,

NSArray * arrContacts = [arrayTotalContacts  valueForKeyPath:@"firstName"];

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 2013-08-09
    • 2011-07-15
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多