Как я могу использовать UISearchDisplayController с UICollectionViewController? - программирование
Подтвердить что ты не робот

Как я могу использовать UISearchDisplayController с UICollectionViewController?

Если вы используете UISearchDisplayController с UITableViewController, когда пользователь забирает строку поиска, она анимируется, чтобы заменить панель навигации.

Я хотел бы получить тот же эффект при использовании UISearchBar в верхней части UICollectionViewController. Любые идеи?

4b9b3361

Ответ 1

Мне пришлось добавить программный поиск searchBar как подпункт UICollectionReusableView, я не мог заставить его работать через IB, поскольку я продолжал получать ошибку прототипа при назначении выхода. Добавление строки поиска в файл реализации работало для меня.

Соответствующие методы заключаются в следующем.

-(void)viewDidLoad
{
    [super viewDidLoad];
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier];
    _objectChanges = [NSMutableArray array];
    _sectionChanges = [NSMutableArray array];
    [self performFetch];
    searchBar = [[UISearchBar alloc]
                  initWithFrame:CGRectMake(0.0, 50.0, self.view.bounds.size.width,
                                           44.0)];
    searchBar.placeholder = @"Search for channels";
    searchBar.tintColor = [UIColor blackColor];
    searchBar.delegate = self;
}


-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    SupplementaryView *header = nil;

    if ([kind isEqual:UICollectionElementKindSectionHeader])
    {
        header = [self.collectionView dequeueReusableSupplementaryViewOfKind:kind
                                                    withReuseIdentifier:@"reuseHeader"
                                                           forIndexPath:indexPath];

        [header addSubview:searchBar];

    }
    return header;
}

Ответ 2

У меня просто был такой же запрос, и я придумал полупеченое, но рабочее решение, которое не связано с переписыванием UISearchDisplayController.

(КОНЕЦ РЕЗУЛЬТАТ: UITableView - то есть ответы на shouldReloadTableForSearchString - накладываются поверх UICollectionView, как только вы нажимаете на поиск, его отклонили, и у вас есть результаты в коллекцииView. Читайте, если это интересно)

В IB создан UIViewController, в который я вставил (см. снимок экрана): представление для целей макета → , в котором я сначала сбросил UISearchBar и контроллер отображения. В одном представлении (бок о бок) я сбросил UICollectionView с пользовательским UICollectionViewCell. Затем я упал в UITableViewProvider (с пользовательским UITableCell, но это не требуется, вы также можете игнорировать UITabBarItem и элемент Nav на скриншоте, что несущественно)

Я установил высоту UITableView равным 0 и подключил все Outlets и делегаты, а итоговый результат следующий: когда курсор входит в UISearchBox, наложение UITableView поверх UICollectionView, так как каждый из них должен указывать значение shouldReloadTableForSearchString del вызывается и результаты отображаются в таблицеView; На searchBarSearchButtonClicked я просто устанавливаю dataSource UICollectionView и вызываю reloadData на нем outlet, et Voila.

Можно подумать, что Apple должна генерировать контроллер отображения поиска; может быть, в будущем выпуске?

(Это работает потому, что так, как оптимизирован контроллер UISearchDisplay, IIRC там на самом деле есть один UITableView для записи символа, расположенный друг над другом)

(Не публиковать код, потому что там довольно много, plz запрашивает, если что-то не просто)

enter image description here

Ответ 3

Вот только быстрый код - работал у меня!

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    let headerView = self.mainPictureCollectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "headerView", forIndexPath: indexPath)

    headerView.addSubview(searchBar)
    return headerView
}