iOS-小Demo(Swift基礎(chǔ)練習)--雙TableView關(guān)聯(lián)

無情最是臺城柳,依舊煙籠十里提!<滑頭小子||奸詐蜥>

效果圖:


分欄聯(lián)動效果
  • 思路:

① 這里我用的是兩個 tableView (執(zhí)行操作(代理)方法時候根據(jù) tag 值加以區(qū)分), 先用StoryBoard布局兩個 tableView. 然后實現(xiàn)代理方法讓兩個欄顯示各自的內(nèi)容(左欄一個分區(qū)row顯示總類, 右欄分區(qū)數(shù)是左欄 row 的數(shù)目),
② 接下來實現(xiàn)第一種需求: 點擊左欄的 row 右欄選中對應(yīng)分區(qū)的第一個row, 點擊右側(cè)欄任一分區(qū)的 row,左欄選中對應(yīng)分區(qū)的 row, 這個在點擊方法中實現(xiàn)起來問題不大
③ 另外一個要求就是, 滑動右欄的時候左欄對應(yīng)會選中右欄分區(qū)對應(yīng)的總類 row; 解決這個問題思路就是在右欄的頭視圖出現(xiàn)和消失的時候進行判斷左欄的選中哪個row , 關(guān)鍵點就是我們要判斷頭視圖出現(xiàn)是從下面還是上面, 也就是你滑動的方向,一般情況下我們需要的是左欄的 row 類名, 是我們右欄最上分區(qū)的名; 那么滑動右欄下滑時候出現(xiàn)的區(qū)就是左欄顯示的 row 名, 而上滑右欄消失的區(qū)的下一個區(qū)就是左欄顯示的 row 名;就這兩個情況
④ 上面是我做之前的思考思路, 還有些出現(xiàn)的問題, 我們遇到了在進行解決.


代碼解析:

  • 定義需要的屬性:
#不要忘了遵循協(xié)議 class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
// 把兩個欄拖成屬性 
 @IBOutlet weak var leftTableView: UITableView!
 @IBOutlet weak var rightTableView: UITableView!
// 存左欄 總類數(shù)據(jù) 并設(shè)置假總類數(shù)據(jù)
    var dataArrayForKind: NSMutableArray? = ["騎士", "勇士", "尼克斯", "快船", "公牛", "CBA"]
// 存右欄 分類細節(jié)數(shù)據(jù) 并設(shè)置分類詳情假數(shù)據(jù)
    var dataArrayForSubKind: NSMutableArray? = [["詹姆斯", "歐文", "樂福", "TT湯普森", "JR", "香濃波特", "福萊","杰弗森"],["庫里", " 湯普森", "格林", "杜蘭特"],["安東尼", "羅斯"], ["保羅", "格里芬", "小喬丹", "皮爾斯"],["韋德", "巴特勒", "朗多"],["易建聯(lián)", "郭艾倫", "周琦", "周鵬", "丁彥雨航", "李根", "王哲林"]]
 
// 構(gòu)造一個枚舉(就是為了練練 Swift 枚舉 這里可以用 BOOl 記錄就行) 記錄右側(cè) 分欄 向上滑動 還是 向下滑動
    enum UpOrDownScroller
    {
        case Up
        case Down
    }
    // 用一個枚舉值記錄滑動方向的枚舉
    var ScrollState: UpOrDownScroller?
    // 記錄右欄滑動的  y 方向的偏移量  便于對比判斷滑動方向
    var offSetForNext: CGFloat = 0

# 下面這個是最后的時候加上的屬性 發(fā)現(xiàn)問題加上的 具體的我們看詳情部分 最后會用動態(tài)圖展示不設(shè)置這個屬性的結(jié)果
 // 用來記錄 右欄上下滑動原因 這里不用枚舉了 用 BOOL, True代表手指滑動右欄,False 代表是點擊左欄引起的 
    var rightScrollReason: Bool!
  • 在viewDidLoad中相關(guān)操作
self.view.backgroundColor = UIColor.grayColor()
 // 設(shè)置兩個分欄tableView 的代理
        self.leftTableView.delegate = self
        self.leftTableView.dataSource = self
        self.rightTableView.delegate = self
        self.rightTableView.dataSource = self
 // 設(shè)置兩個 TableView 的 tag 值  執(zhí)行代理方法便于區(qū)分
        self.leftTableView.tag = 1001
        self.rightTableView.tag = 1002
// 關(guān)掉豎直方向的滑條
        self.leftTableView.showsVerticalScrollIndicator = false
        self.rightTableView.showsVerticalScrollIndicator = false
// 注冊兩個分欄的 cell
        self.leftTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Left_Cell")
      self.rightTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Right_Cell")
  • 執(zhí)行代理方法顯示內(nèi)容
// 設(shè)置分區(qū)數(shù)
 func numberOfSectionsInTableView(tableView: UITableView) -> Int {
       if tableView.tag == 1002
       {
           return dataArrayForSubKind!.count
       }else
       {
           return 1
       }
   }```

```code
// 設(shè)置分區(qū)下面的行數(shù)
   func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       if tableView.tag == 1001
       {
           return dataArrayForKind!.count
       }else
       {
           return dataArrayForSubKind![section].count
       }
   }```

```code
// 設(shè)置 cell
   func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      // 設(shè)置讓左欄的 cell 間隔顯示不一樣的顏色好區(qū)分
       if tableView.tag == 1001
       {
           let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Left_Cell")!
           cell.textLabel?.text = dataArrayForKind![indexPath.row] as? String
           
           if indexPath.row % 2 != 0
           {
               cell.backgroundColor = UIColor.cyanColor()
           }else
           {
               cell.backgroundColor = UIColor.greenColor()
           }
           
           return cell
       }else
       {
           let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Right_Cell")!
          cell.textLabel?.text = dataArrayForSubKind![indexPath.section][indexPath.row] as? String
          return cell
       }
   }```
   
``` code
// 調(diào)節(jié)行高  按照自己的需要設(shè)置即可
   func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
       if tableView.tag == 1001
       {
           return (self.view.bounds.size.height - 420.0 ) / 3.0
       }
       else
       {
           return 60
       }
   }```
   
```code
// 設(shè)置右側(cè)頭視圖顯示 讓右側(cè)頭視圖顯示為分區(qū)(總類)的名字
   func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
       if tableView.tag == 1002
       {
       let headTitle: UILabel = UILabel()
       headTitle.text = dataArrayForKind![section] as? String
       headTitle.font = UIFont.systemFontOfSize(24)
       headTitle.textAlignment = NSTextAlignment.Center
      
       return headTitle
       }
       return nil
   }```

```code
// 設(shè)置頭視圖的高度
   func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
       if tableView.tag == 1001
       {
           return 0
       }else
       {
           return 50
       }
   }```
---------------
下面開始實現(xiàn)兩個分欄的關(guān)聯(lián):
---------------
- 在點擊方法中實現(xiàn)點擊其中一個欄 另一滑動到響應(yīng)的位置

```code
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
       if tableView.tag == 1001
       {
// 這里設(shè)置的false  是由于點擊了左欄  導(dǎo)致右欄滑動 所以不是手指滑動引起的右欄滑動效果 false 表示不是手指滑動的
           rightScrollReason = false
# 點擊左欄的 row 右欄選定對應(yīng)分區(qū)的第一個 row
self.rightTableView.selectRowAtIndexPath(NSIndexPath.init(forRow: 0, inSection: indexPath.row), animated: true, scrollPosition: UITableViewScrollPosition.Top   
       }else
       {
# 點擊右欄的某個區(qū)的 row 左欄選定該區(qū)對應(yīng)的 row
self.leftTableView.selectRowAtIndexPath(NSIndexPath.init(forRow: indexPath.section, inSection: 0), animated: true, scrollPosition: UITableViewScrollPosition.Middle
        }
   }

實現(xiàn)右欄手指滑動左欄對應(yīng)滑動效果:

  • 判斷右欄的滑動方向
 func scrollViewDidScroll(scrollView: UIScrollView) {
        if scrollView.tag == 1002
        {// 這個判斷可以帶入打印一下 
# 下滑的時候 y 方向偏移為負值 向上時候為正  所以上一個偏移 y 值大于現(xiàn)在這個偏移值, 說明上一個到現(xiàn)在這個位置是下滑導(dǎo)致反之上滑
            if offSetForNext > scrollView.contentOffset.y
            {
                ScrollState = UpOrDownScroller.Down
            }else
            {
                ScrollState = UpOrDownScroller.Up
            
            } 
            // 每次比較完后記錄當前的偏移量
            offSetForNext = scrollView.contentOffset.y
            // 判斷滑動原因  如果是手指拖拽的 那么記錄原因 true
            if scrollView.dragging
            {
                rightScrollReason = true
            }
        }
    }
  • 設(shè)置右欄 向下滑動時候 有一個頭視圖將要出現(xiàn)的時候 左側(cè)自動選中要出現(xiàn)的這個頭視圖分區(qū)對應(yīng) row

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

判斷條件滿足 是右欄 tableView 并且是向下滑動 而且滑動原因是手指拖拽滑動 不然的話點擊左欄促使右欄滑動那么又反過來導(dǎo)致左欄滑動

if tableView.tag == 1002 && ScrollState == UpOrDownScroller.Down && rightScrollReason

  {

self.leftTableView.selectRowAtIndexPath(NSIndexPath.init(forRow: section, inSection: 0), animated: true, scrollPosition: UITableViewScrollPosition.Middle)
}

}```
  • 右欄上滑的時候 有頭視圖要消失的時候 左側(cè)選中將要消失的下一個區(qū)號對應(yīng) row
  func tableView(tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
# 判斷條件滿足 是右欄 tableView 并且是向上滑動 而且滑動原因是手指拖拽滑動  不然的話點擊左欄促使右欄滑動那么又反過來導(dǎo)致左欄滑動 
       if tableView.tag == 1002 && ScrollState == UpOrDownScroller.Up && rightScrollReason
       {            
self.leftTableView.selectRowAtIndexPath(NSIndexPath.init(forRow: section + 1, inSection: 0), animated: true, scrollPosition: UITableViewScrollPosition.Middle)
       }        
   }```

----------
![**不考慮右欄的滑動是不是手指拖拽時效果(bug 點擊左欄右欄滑動同時左欄也滑動了**)](http://upload-images.jianshu.io/upload_images/1523603-f0fa29a4d9628dc8.gif?imageMogr2/auto-orient/strip)
















最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市狞甚,隨后出現(xiàn)的幾起案子廓旬,更是在濱河造成了極大的恐慌,老刑警劉巖涩盾,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砸西,居然都是意外死亡址儒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門鸳慈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喧伞,“玉大人,你說我怎么就攤上這事∷陨希” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵彼念,是天一觀的道長浅萧。 經(jīng)常有香客問我,道長吩案,這世上最難降的妖魔是什么帝簇? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮残揉,結(jié)果婚禮上芋浮,老公的妹妹穿的比我還像新娘。我一直安慰自己镇草,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布凛驮。 她就那樣靜靜地躺著条辟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羽嫡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天婚惫,我揣著相機與錄音先舷,去河邊找鬼。 笑死蒋川,一個胖子當著我的面吹牛撩笆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夕冲,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歹鱼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秩霍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铃绒,失蹤者是張志新(化名)和其女友劉穎颠悬,沒想到半個月后矮燎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诞外,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡灾票,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年刊苍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片正什。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡婴氮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出主经,到底是詐尸還是另有隱情,我是刑警寧澤渠驼,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布鉴腻,位于F島的核電站百揭,受9級特大地震影響爽哎,放射性物質(zhì)發(fā)生泄漏课锌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一渺贤、第九天 我趴在偏房一處隱蔽的房頂上張望请毛。 院中可真熱鬧,春花似錦固棚、人聲如沸统翩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汁汗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霎匈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工铛嘱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墨吓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓帖烘,卻偏偏與公主長得像橄杨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子式矫,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多采转,會對里面所有的內(nèi)容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,486評論 1 14
  • 廢話不多說板熊,直接上干貨 ---------------------------------------------...
    小小趙紙農(nóng)閱讀 3,357評論 0 15
  • 當我們老了干签,沒有什么用了,世界都開始遠離我們筒严;當有一天丹泉,我們靜靜的坐在窗前摹恨,望著斜陽,回望人生晒哄,那時的我們對這個世...
    魚兒不會游閱讀 613評論 0 2
  • 人類原本是一個不可分割的整體肪获,我們不是孤獨的,孤立的孝赫,作為人類成員,我們在生命的根部都是聯(lián)系在一起的伐债。從這個角度看...
    厚厚的三明治閱讀 246評論 0 0
  • 初戀的時候致开,我們不懂愛情;懂得愛情的時候双戳,已錯過戀愛的季節(jié)。初戀是青澀的飒货,但卻是最美好的,很多人的初戀都沒有修成正...
    白白的星座閱讀 353評論 0 0