close

原本想要先學如何使用相機,但發現使用模擬器好像沒辦法利用電腦的鏡頭作試驗,決定先擱在一邊。想要試試展示所有小汽車的功能,原本以為會叫 ListView 之類的名字,後來才搞清楚原來是 TableView。

首先把 table view controller 拉到 storyboard 去,所謂的拉,不是拉到既有的 window 上(原本的想法是替換掉既有的 window 上的 view controller),而是拉到空白處,這樣會新增一個 window,記得要把箭頭指向新 window,這樣程式跑起來才會顯示這個 window。

要確認 Table view 的 content 是設成 Dynamic prototypes,表示 row 的數量等是執行時才決定;與此相對的是 static cells,用在像 setting 的畫面,畫面上可以設定的項目是在設計時就確認了。

Table view cell 有 style 可以選,按自己需要去挑。

給 cell 設 identifier,感覺像是名字... 比如設 CarCell。

建立一個繼承 TableViewController 的 class (File => New => File => template 選 Cocoa Touch Class => 名字設 CarsTableViewController(就一般習慣會把原有 class 的名字接在後面), Subclass of 選 UITableViewController,XIB 不知道是什麼,先不用勾),接著在 storyboard 上選擇 TableViewController 並把他的 class 改成自己的 class (在 Identity Inspector 畫面)

回到 Main.storyboard,選取 view controller,在右邊的 Identity Inspector 處,把 class 換成剛新增的 CarTableViewController。

 

Table view 使用 delegation pattern 以確保 view 和 model 是分開的(還要再研究到底是什麼)。View controller 對 table view 而言就是 delegate(委託、代表),所以要實作一些 function 讓 view 呼叫

override func numberOfSections(in tableView: UITableView) -> Int {            1
   return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return 10
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath ) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "CarCell", for: indexPath)
   cell.textLabel?.text = "Car id # \(indexPath.row)"
   return cell
}                                                

第一個 numberOfSections() 是 view 詢問有多少 section 要顯示

第二和第三我實在不懂這命名怎麼回事

第二個是用來詢問某個 section 要顯示幾個 row

第三個是用來詢問每個 row 要顯示的內容,裡面有用到 CarCell 這個字,其實就是先前 cell 的 identifier,這裡就是隨便顯示 Car id # 1 之類的文字。 而 indexPath 印出來是兩個數字的陣列,應該是 section index 以及 row index。

執行結果如下:

CarsTableView.png

看到的資料裡說若是我們的資料量很大,如果一次載入一定會有記憶體不足的問題;而若是顯示時才不斷載入及移出,那就會有率能上的問題。他提到 Apple 在這裡用了 cache(或 queue),當呼叫 dequeueReusableCell() 時,會先在 cache 裡先找有沒有需要的 cell 存在,如果找不到才重建一個 cell;而一個 cell 被移出畫面外時,不是從記憶體裡移除,而是被送到 cache 裡等待重複使用。

我試著把 row 改成 500,然後在第三個函數裡印出 indexPath 出來結果發現當程式一開始執行時,畫面顯示 1-12 的內容,但 debug window 則看到 [0, 16] 表示預先多載入了一些內容。奇怪的地方在於:當我小心翼翼地只往下捲動一下部份,讓 13 出現在畫面上, debug window 也顯示了 [0, 13],表示又要了一次這行的資料? 當我往下捲,再回頭往上捲時,也是看到每個 cell 都被詢問過,不知道怎麼會這樣?有個可能是:這個 function 一直會被呼叫,是更後面的 cell 才被 cache。 這實在有點說不通,如果我在這邊拉 DB 的資料,而這裡每次都會被呼叫,那不就每次都還要打 DB,那效能還是很差啊? 還要再研究! 然後我也搞不懂,如果每個 row 都要來問,那我不是要一直打DB?還是說應該在某處自己作 cache 讓他問?

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 屁啦屁啦 的頭像
    屁啦屁啦

    玩小車的小屁孩爸

    屁啦屁啦 發表在 痞客邦 留言(0) 人氣()