Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在二维阵列中使用NSPredicate_Iphone_Objective C_Memory Management_Nspredicate_Multidimensional Array - Fatal编程技术网

Iphone 在二维阵列中使用NSPredicate

Iphone 在二维阵列中使用NSPredicate,iphone,objective-c,memory-management,nspredicate,multidimensional-array,Iphone,Objective C,Memory Management,Nspredicate,Multidimensional Array,此问题基于我上一个问题的相同应用程序/来源,可在此处找到: 我有一个嵌套数组,打印出来时看起来像这样(我只复制并粘贴了它的一小部分) 我得到了一个错误,我不能分配足够的空间,这意味着我一定是做错了什么,我只是不知道是什么 在上述方法中,搜索部分的注释掉部分可以工作,但crayonColors只是一个简单的NSMutableDictionary,其中没有嵌套数组 提前谢谢 据我所知,单用一个谓词是做不到的。但是,您可以在两个单独的调用中使用键路径运算符和谓词来完成此操作 所以,你有一个术语数组。

此问题基于我上一个问题的相同应用程序/来源,可在此处找到:

我有一个嵌套数组,打印出来时看起来像这样(我只复制并粘贴了它的一小部分)

我得到了一个错误,我不能分配足够的空间,这意味着我一定是做错了什么,我只是不知道是什么

在上述方法中,搜索部分的注释掉部分可以工作,但crayonColors只是一个简单的NSMutableDictionary,其中没有嵌套数组


提前谢谢

据我所知,单用一个谓词是做不到的。但是,您可以在两个单独的调用中使用键路径运算符和谓词来完成此操作

所以,你有一个术语数组。您需要一个名称包含“a”的术语数组(例如)。以下是您要做的:

NSArray * allTerms = ...; //your array of arrays of terms
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"];

NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"];
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter];
这里的神奇之处在于
valueForKeyPath:
位。获取对象数组的数组,并返回对象数组。下面是它的作用:
NSArray
将通过
将密钥路径断开,从而为其提供
@unionofarray
self
。它将使用第二个位(self)在自身上递归并调用
valueForKeyPath:
,然后它将返回一个数组数组。然后它将把所有这些数组合并到一个数组中,忽略重复的数组。(如果要删除重复项,请改用
@distinctunionofarray

一旦我们有了这个对象数组,我们就可以使用一个简单的
名称来过滤它,该名称包含“blah”
谓词

(我原以为我可以使用
子查询
来实现这一点,但这是一个奇怪的怪兽,对我来说没有什么是显而易见的。)


对于super intrepid,您可以使用KickingBear的collection extensions()通过一个方法调用来实现这一点,但我强烈建议不要在生产环境中使用类似的hack。:)

假定
术语
对象具有
名称
属性。我的问题是“你想实现什么?”你有一个对象数组,但你想从中得到什么?(也就是说,你想得到什么对象?)所以sectionArray有一个术语对象的嵌套数组。使用NSPredicate,我试图搜索此人在搜索栏中键入的任何内容。这意味着如果他们输入“A”,我想要任何包含“A”的东西。我正在尝试将这些术语对象放入FilterDarray。但是,您是希望它们位于单个数组中,还是希望它们位于已过滤数组的数组中?或者其他什么?附带说明:如果数组包含字典,则需要将键路径更改为
@unionOfArrays@self
,因为在原始键路径
@unionOfArrays.self中,
self
部分被解释为从字典中检索对象的键…@albertamg感谢字典提示!你们帮我省了一个小时的挠头时间。@albertamg&Dave Delong你们帮我省了很多时间。多谢!
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section 
{
    // Normal table
    if (aTableView == self.tableView) return [[self.sectionArray objectAtIndex:section] count];

    // Search table
    //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
    //self.filteredArray = [self.crayonColors filteredArrayUsingPredicate:predicate];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
    self.filteredArray = [[self.sectionArray objectAtIndex:section] filteredArrayUsingPredicate:predicate];


    return self.filteredArray.count;
}
NSArray * allTerms = ...; //your array of arrays of terms
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"];

NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"];
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter];