Как заставить несколько UITableViewCell общаться / взаимодействовать друг с другом? - PullRequest
1 голос
/ 04 марта 2012

У меня есть несколько ячеек в UITableview, каждая со своими UIScrollView.Когда пользователь прокручивает одну из ячеек, я бы хотел, чтобы все остальные ячейки следовали.Есть ли способ создать такое взаимодействие, передав contentOffset в другие ячейки?

Я думаю о делегировании, но пока не могу заставить это работать.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Это на самом деле довольно просто. Просто реализуйте метод UIScrollViewDelegate scrollViewDidScroll: в вашем viewController и там вы устанавливаете contentOffset всех остальных ячеек. Сделайте ваш viewController делегатом scrollview в каждой ячейке, и все готово.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MyFancyCell";
    MyFancyCell *cell = (MyFancyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.scrollView.delegate = self; // actually you would do this in the storyboard or inside (cell == nil) if you don't use storyboard
    // configure cell    
    return cell;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{
    if (scrollView == self.tableView) {
        // each tableView is a UIScrollView too. 
        // they will call this method which will lead to strange results if you change your cells scrollView.
        // just ignore the scroll events of the tableView
        return;
    }
    CGPoint contentOffset = scrollView.contentOffset;
    for (MyFancyCell *cell in [self.tableView visibleCells]) {
        cell.scrollView.contentOffset = contentOffset;
    }
}

EDIT: Вы можете переадресовать вызовы делегатов обратно в ячейку, например так:

for (MyFancyCell *cell in [self.tableView visibleCells]) {
    cell.scrollView.contentOffset = contentOffset;
    [cell scrollViewDidScroll:cell.scrollView];
}

или imho лучше. Сделайте viewController делегатом ячейки, и в методе scrollViewDidScoll внутри ячейки вы сообщаете делегату (viewController), что contentOffset изменился, так что контроллер представления обновляет ячейки.

// MyFancyCell.h
@protocol MyFancyCellDelegate 
- (void)fancyCell:(MyFancyCell *)cell didChangeContentOffset:(CGPoint)offset;
@end
@property (weak, nonatomic) id <MyFancyCellDelegate> delegate;

// MyFancyCell.m

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
     // do your work here
     [self.delegate fancyCell:self didChangeContentOffset:scrollView.contentOffset];
}

// ViewController.m

- (void)fancyCell:(MyFancyCell *)cell didChangeContentOffset:(CGPoint)offset {
    for (MyFancyCell *cell in [self.tableView visibleCells]) {
        cell.scrollView.contentOffset = offset;
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MyFancyCell";
    MyFancyCell *cell = (MyFancyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.delegate = self;
    // configure
}
0 голосов
/ 04 марта 2012

Делегация была бы идеальной.Вы можете передать смещение содержимого каждому табличному представлению и сделать так, чтобы все они были делегатами друг друга (помните, что #importing в .h иногда создает бесконечный цикл, поэтому просто создайте категории в файле .m и выполните свой #importingесть).

0 голосов
/ 04 марта 2012

Синхронизировать между ячейками можно в методе делегата cellForRowAtIndexPath.Для любого изменения в одной ячейке вы можете вызвать reloadData tableView или перезагрузить только выбранные ячейки, вызвав метод reloadRowsAtIndexPath.

...