tableView联动

让我们共同学习一下tableView联动,我这也是从简书上看来的一篇文章,来亲自实现一下。学习文章地址:http://www.jianshu.com/p/dfb73aa08602

先上图:

[图片上传失败...(image-e5c7d1-1513741413430)]

功能需求(两点):
  • 点击左边tableVIew的cell,右边的tableView滑动至指定位置。

  • 滑动右边tableView的cell,左边的tableView滑动至指定位置。

具体思路:
  • 实现点击左边tableView同时滚动右边tableView,只需要实现tableView的代理方法。

    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

    然后在代理方法里边拿到右边的tableView,实现让其滚动到第indexPath.row分区,第0行即可,代码如下:

    • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    // 如果点击的是右边的tableView,不做任何处理

    if (tableView == self.rightTableView) return;

    // 点击左边的tableView,设置选中右边的tableView某一行。

    左边的tableView的每一行对应右边tableView的每个组第0行

    [self.rightTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:indexPath.row] animated:YES scrollPosition:UITableViewScrollPositionTop];

    }

    我们这里不处理右边tableView的点击事件,所以

    if (tableView == self.rightTableView) return;

    接下来,拖动右边的tableView,来找到左边tableView对应的某一行。

    我们要动态选中左边的tableView,就需要拿到右边tableView现在滚动到了那个组。UITableView有两个代理方法:

    // 一个头标题即将显示的时候调用

    • (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section

    // 一个头标题即将消失的时候掉用

    • (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section

    利用这两个方法就可以拿到当前所在哪个组实现这个功能了。

还有一个更简单的方法,在tableView中,是不常用的,叫做,indexPathsForVisibleRows官方文档解释是:

The value of this property is an array of NSIndexPath objects each representing a row index and section index that together identify a visible row in the table view. If no rows are visible, the value is nil.

大概意思是:返回一个屏幕上可见的cell的indexPath集合

好的,重点来了,拿到这个集合,不就能拿到目前屏幕上顶端的cell的indexpath了吗,那就如愿以偿的拿到现在所在第indexpath.section个分区了。

上代码:

pragma mark - UIScrollViewDelegate

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{

// 监听tableView滑动

// 如果现在滑动的是左边的tableView,不做任何处理

if ((UITableView *)scrollView == self.leftTableView) return;

// 滚动右边tableView,设置选中左边的tableView某一行。

indexPathsForVisibleRows属性返回屏幕上可见的cell的indexPath数组,

利用这个属性就可以找到目前所在的分区

[self.leftTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:self.rightTableView.indexPathsForVisibleRows.firstObject.section inSection:0] animated:YES scrollPosition:UITableViewScrollPositionMiddle];

}

[详解]:

  • 首先监听scrollView的拖动,本demo不处理左边tableView的滚动,所以

    if ((UITableView *)scrollView == self.leftTableView) return;

  • 下一句代码的意思是,拿到当前屏幕上可见cell的第一行cell所在的分区,然后让左边的tableView选中第0分区(它只有一个分区)的这一行就OK了。

    self.rightTableView.indexPathsForVisibleRows.firstObject.section

    demo地址:https://github.com/RenZhengYang/ZYLinkageTableView


--------------------------补充-------------------------------

1.点击左边tableView的时候会有阴影效果

  • 点击左边的tableView,右边的tableView是从当前位置动画滚动到相应位置的,既然有滚动,就会调

    • (void)scrollViewDidScroll:(UIScrollView *)scrollView

    这个代理方法,说白了就是拖动了右边tableView,拖动右边的过程中会陆续选中左边。

如果不想要这个效果,有两个办法,一个是直接把

  • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

中的动画滚动的属性animated值改成NO

  • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

// 如果点击的是右边的tableView,不做任何处理

if (tableView == self.rightTableView) return;

// 点击左边的tableView,设置选中右边的tableView某一行。

左边的tableView的每一行对应右边tableView的每个分区

[self.rightTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:indexPath.row] animated:NO scrollPosition:UITableViewScrollPositionTop];

}

这样做右边的tableView就是无动画滚动了,也就不会再调scrollViewDidScroll:方法。

但是如果还想右边tableViewyou滚动效果,另一种解决方法是把

  • (void)scrollViewDidScroll:(UIScrollView *)scrollView

方法换成

  • (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

这个代理方法方法就行了。有的界面好像就是这样做的,但是有bug(估计饿了么没测出来),这个方法的注释为

// called when scroll view grinds to a halt 当滚动视图戛然而止--有道翻译如是说

这个方法调用与否在于你的手指是否在动画停止之前离开了屏幕,如果在动画结束之前手指离开屏幕,此方法调用没什么问题。but,如果动画已经停止,再把手指拿开,这个方法是不会调的。

解决这个bug的关键在于,让手指离开的时候手动调一次这个代理方法,那怎么才能知道手指什么时候离开呢?scrollView给我们了另一个代理方法:

  • (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

这个方法在结束拖拽的时候调,正好解决了我们的问题:

  • (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{

// 推拽将要结束的时候手动调一下这个方法

[self scrollViewDidEndDecelerating:scrollView];

}


1.// 默认选择左边tableView的第一行

[_leftTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop];

必须在tableView数据加载完毕后,才会调用。否则会报错。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容