我正在使用此示例搜索UICollectionView:https://github.com/ihomam/CollectionViewWithSearchBar/blob/master/collevtionViewWithSearchBar/CollectionViewController.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
// Configure the cell
if (self.searchBarActive) {
cell.laName.text = self.dataSourceForSearchResult[indexPath.row];
} else {
cell.laName.text = self.dataSource[indexPath.row];
}
return cell;
}
...只有我的应用设置有点不同:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
PlaceCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
Place *p = [_entries objectAtIndex:indexPath.item];
if (self.searchBarActive) {
cell.placeName.text = self.dataSourceForSearchResult[indexPath.item];
} else {
cell.placeName.text = p.PName;
cell.placeImg.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:p.PImage]]];
}
return cell;
}
因此,如果我按照它的方式运行它,那么self.dataSourceForSearchResult [indexpath.item]将返回一切,我收到错误,因为它没有返回字符串...
&#39; Can't use in/contains operator with collection <Place: 0x17d8ad70> (not a collection)'
但我想要它做的是搜索p.PName结果。类似的东西:
self.dataSourceForSearchResult[p.PName indexpath.item]
答案 0 :(得分:2)
浏览了github代码后,我认为问题的核心在于其他地方。
问题在于:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self contains[c] %@", searchText];
self.dataSourceForSearchResult = [self.dataSource filteredArrayUsingPredicate:resultPredicate];
}
此方法的作用是根据谓词过滤匹配来自self.datasource
的项目(我假设您将其重命名为self.entries
,我希望您也在此处执行此操作)。这个谓词有点难以理解,特别是如果你以前没有经验。让我们分解一下:
self
- 在此上下文中,它表示将根据条件检查的对象。该对象将是数组的一个元素。
contains[c]
- 这就是条件。如果self
有contains
,则会检查[c]
。 %@
表示检查不区分大小写。
searchText
- 这是'某事'。它将替换为NSString
。
这在示例中起作用,因为数组包含NSPredicate
个对象,而contain
知道如何检查它们是否Place
(子字符串)。由于您的数组包含NSPredicate
个对象,contain
不知道如何检查self.PName contains[c] %@
某些内容(一个子位置?:P)。
要解决此问题,请使用此PName
替换谓词。这个将访问数组的每个对象的self.dataSourceForSearchResult[indexpath.item]
属性,并检查它是否包含子字符串。
关于第二个问题,NSString
实际上不会返回Place
而是EVERYTHING
个对象,但不是self.datasource
,而是其中一个已过滤的对象。它实际上从来没有在你的应用程序中达到,因为它早先崩溃了。没有冒犯,但我认为你并不完全理解这段代码中的整个顺序。要打破它:
self.entries
(或重命名时为collectionView:cellForItemAtIndexPath:
)中的数据绘制单元格。正在调用searchBar:textDidChange:
。self.dataSourceForSearchResult
)。collectionView:cellForItemAtIndexPath:
数组。self.dataSourceForSearchResult
),但由于搜索栏不为空,我们现在只使用- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
中的对象。为了使其正常运行,- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
PlaceCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
Place *p;
// retrieve item from appropriate array
if (self.searchBarActive) {
p = self.dataSourceForSearchResult[indexPath.item];
} else {
p = self.entries[indexPath.item];
}
// populate the cell - we do this regardless of whether the searchbar is active or not
cell.placeName.text = p.PName;
cell.placeImg.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:p.PImage]]];
return cell;
}
应如下所示:
services.xml