如何让多个UITableViewCells相互通信/互动?

时间:2012-03-04 05:19:05

标签: iphone ios uitableview delegates uiscrollview

我在UITableview中有几个单元格,每个单元格都有自己的UIScrollView。当用户滚动其中一个单元格时,我希望所有其他单元格都可以跟随。有没有办法通过将contentOffset传递给其他单元格来创建这种交互?

我在想代表团,但到目前为止,我无法让这个工作。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这实际上非常简单。只需在viewController中实现UIScrollViewDelegate方法scrollViewDidScroll:,然后设置所有其他单元格的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;
    }
}

编辑: 您可以将委托调用转发回单元格,如下所示:

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

或更好的方式。使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
}

答案 1 :(得分:0)

您可以在cellForRowAtIndexPath委托方法中的单元格之间进行同步。对于一个单元格中的任何更改,您可以调用tableView的reloadData,或通过调用reloadRowsAtIndexPath方法仅重新加载选定的单元格。

答案 2 :(得分:0)

代表团将是完美的。您可以将内容偏移量传递给每个表视图,并让它们都是彼此的委托(请记住,.h中的#importing有时会创建一个无限循环,所以只需在.m文件中创建类别并执行#importing有)。