xcode将文本字符串加载到UISearchController中

时间:2015-07-24 15:45:15

标签: ios xcode6 uicollectionview uisearchcontroller

我正在使用此示例搜索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]

1 个答案:

答案 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] - 这就是条件。如果selfcontains,则会检查[c]%@表示检查不区分大小写。

  • searchText - 这是'某事'。它将替换为NSString

这在示例中起作用,因为数组包含NSPredicate个对象,而contain知道如何检查它们是否Place(子字符串)。由于您的数组包含NSPredicate个对象,contain不知道如何检查self.PName contains[c] %@某些内容(一个子位置?:P)。

要解决此问题,请使用此PName替换谓词。这个将访问数组的每个对象的self.dataSourceForSearchResult[indexpath.item]属性,并检查它是否包含子字符串。

您可以在NSHipsterdocs

中详细了解NSPredicate

关于第二个问题,NSString实际上不会返回Place而是EVERYTHING个对象,但不是self.datasource,而是其中一个已过滤的对象。它实际上从来没有在你的应用程序中达到,因为它早先崩溃了。没有冒犯,但我认为你并不完全理解这段代码中的整个顺序。要打破它:

  1. 显示视图控制器,搜索栏为空,因此根据self.entries(或重命名时为collectionView:cellForItemAtIndexPath:)中的数据绘制单元格。正在调用searchBar:textDidChange:
  2. 用户在搜索栏中输入内容。 (这会触发self.dataSourceForSearchResult)。
  3. 匹配的对象将被过滤为collectionView:cellForItemAtIndexPath:数组。
  4. 重新加载集合视图。
  5. 重新绘制单元格(再次调用self.dataSourceForSearchResult),但由于搜索栏不为空,我们现在只使用- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;中的对象。
  6. 为了使其正常运行,- (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