2012-03-04 58 views
1

我在UITableview中有幾個單元,每個單元都有自己的UIScrollView。當用戶滾動其中一個單元格時,我希望所有其他單元格都遵循。有沒有辦法通過將contentOffset傳遞給其他單元來創建這種交互?如何讓多個UITableViewCells相互溝通/互動?

我在想代表團,但到目前爲止我無法讓這個工作。有任何想法嗎?

回答

2

這其實很簡單。只需在您的viewController中實現UIScrollViewDelegate方法scrollViewDidScroll:並在那裏設置所有其他單元格的contentOffset。讓你的viewController成爲每個單元格中滾動視圖的代表,然後就完成了。

- (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 
} 
+0

這個工作,唯一的問題是,我也需要使UITableViewCell成爲滾動視圖的委託。我知道一個對象不能有2個委託,所以你會建議再次調用每個* cell的委託方法*雖然我的viewController? – spiralstairs 2012-03-05 04:52:07

+0

我做了一個編輯以顯示兩種可能的方式。第二種方法可能更清潔,因爲您不必將所有委託方法轉發給單元格。 – 2012-03-05 12:06:17

+0

謝謝!它完美解決了。 – spiralstairs 2012-03-11 18:36:05

0

您可以同步cellForRowAtIndexPath委託方法中的單元格。對於任何一個單元格的更改,您可以調用tableView的reloadData,或通過調用reloadRowsAtIndexPath方法重新加載僅選定的單元格。

0

代表團將是完美的。您可以將內容偏移量傳遞給每個表視圖,並讓它們全部成爲彼此的代表(請記住,.h中的#importing有時會創建無限循環,因此只需在.m文件中創建類別並執行#importing那裏)。