讓不懂程式設計的人愛上iPhone開發系列2 iOS12+Swift4.2版-Checklists-04
table view表檢視的詳解
在繼續操作之前,還是讓我們更進⼀步的瞭解⼀下表檢視。UITableView物件⽤用來顯示⼀個列表。和我們經常提到的表不同,table view並不會有多行和多列,因為UITableView實際上只有行的概念, ⽽沒有列的概念。與其說它是⼀個表格,不如說它是⼀個列表。 不知道蘋果的⼯程師當年為何這樣來命名table view,但既然已經這樣了,還能怎樣呢? 接受這個事實吧。
如果你想要的是那種有多行多列的”真正“的表格,建議考慮使用UIKit裡面提供的UICollectionView物件。它跟UITableView的使用方法類似,但是可以允許使用多個列。
此外,在iOS中,存在兩種型別的表:plain和grounped。它們的使⽤方法差不多,不過有些⼩小的差別。 從視覺呈現的⾓度來看,grouped表的各行會被整合到⼀起,然後會有淺灰色的背景。 我們還是看圖說話吧。

在上圖中,左邊是所謂的plain 表檢視,右邊是grouped表檢視
問題來了,那麼在實際使用的時候,我們應該選擇哪種表檢視呢?
如果各⾏的內容形式比較相似,我們會採用plain樣式的表,⽐如位址列中的聯絡方式,其中每⼀⾏都會包含⼀個人名。
⽽如果各⾏的內容形式有所差異,我們就會採⽤用grouped樣式的表。,⽐如聯絡方式中的不同屬性。⽐如⼀個姓名⾏,⼀個地址⾏,⼀個電話號碼⾏,等等。
在Checklists這款應用中,我們會⽤到這兩種不同形式的table view。
表的資料來⾃於rows。在Checklists的⾸個版本中,每⼀⾏都會對應⼀個待辦事項。雖然我們可以讓 它顯⽰很多⾏(⽐如成千上萬⾏),但這種設計方式是⽐較反⼈類的。想想看,如果你在淘寶裡面要滾動上萬⾏表格才能找到⾃⼰要買的東西,恐怕你會被唾沫淹死的~
表的資料是⽤用cells的形式來呈現的。⼀個cell和⼀個row會對應起來,但兩者是完全不同的概念。 可能初次接觸table view的時候,⼤家對cell和row的區別都有點搞不懂。沒關係,我們先⼤概瞭解 下,後面在實際操作的過程中就會逐漸熟悉起來的。
⼀個cell實際上是⼀個視覺元素,其中包含了當前時刻要顯示的⼀⾏資料。如果你的表需要在同⼀時間顯示10⾏資料,那麼它只會有10個cells,雖然你可能會有上千rows的真實資料。 如果某⼀⾏資料被滾動到界⾯之外變得不可見,它所佔⽤的cell就會被用於顯⽰示⼀個新的row。
這麼說可能⼤家還是有點糊塗,還是看圖更明白點。

新增prototype cell(表格原型)
在iOS開發的上古時代(iOS5之前),要建立一個table的cell是非常麻煩的事情,但是此後Xcode提供了⼀個⾮常⽅方便的功 能,叫prototype cells,這樣我們就可以在Interface builder中視覺化設計⾃己的cells。
好了,讓我們繼續來動⼿操作下。 在Xcode中開啟storyboard,然後選擇空白的cell,此時它會變成藍色:

小技巧:
如果是從畫布上選擇,很可能選中的不是我們想要的。所以,如果要精準選擇某個UI元素,最簡單的方式就是從左側的Document Outline樹狀圖中選擇。
從Object Library中拖曳出一個Label放到這個cell上⾯面。將其命名為:Checklist Item。注意讓這個標籤佔據整個cell的寬度(兩邊各留少量的邊緣)。

需要注意的是,如果你簡單的把這個標籤拖動到表檢視上,那麼可能會失敗。應該怎麼做呢?我們需要把標籤拖動到cell上面。為了確保這一點,可以在Document Outline中檢查和確認。

接下來讓我們在標籤旁邊新增一個checkmark。checkmark是cell的accessory,也就是cell右側的附屬⼦檢視。我們可以選擇標準的附屬控制元件,也可以使⽤自己設計的樣式。
首先還是選中Table View Cell。然後在右側切換到Attributes Inspector,然後將Accessory型別更改為Checkmark:

如果你看不到這個選項,那麼要檢查一下是否已經選擇了Table View Cell,而不是Content View或是下面的Label。
好了,現在我們的設計看起來可能是下面這樣的:

注意:如果你設定的Label過寬,可能會蓋住了checkmark:ballot_box_with_check:,這時就需要稍微調整下它的寬度。
接下來我們還需要設定cell的reuse identifier。這個古怪的名詞是table view表檢視的內部術語,⽤用 於找到那些可以重⽤的cell。(⽐如當之前的rows滾動到介面之外,⽽新的rows需要顯示的時候)。
此時table view需要將cell分配給那些需要顯示的新rows,顯然重用之前已存在的cells比建立新的cells要高效。正是因為使⽤了這種技術,我們的表檢視滾動才會顯得⾮常流暢。
如果我們想在同一個表中顯⽰不同型別的cells,也需要用到reuse identifier。⽐如,某個型別的cell 中會顯⽰一個圖⽚和一個標籤,⽽另一個型別的cell中會顯示一個標籤和一個按鈕。我們需要給每個 cell型別提供一個獨特的identifier識別符號,這樣表檢視才能將正確的cell分配給所需顯示的cell。
儘管Checklists中只會⽤用到⼀種類型的cell,但我們仍然需要給它指定一個identifier。
繼續保持選中Table View Cell,然後在右側設定Accessory型別上方的Identifier中輸入ChecklistItem

編譯警告:warning:
如果此時編譯專案,會發現之前提示說protytype table cells needing a reuse identifier之類的警告已經消除了。
但是,我們又看到了一個新的警報。

這個警告看起來比較熟悉,其實就是我們在上一個專案中也曾經遇到的。當沒有新增任何Auto Layout的constraints,就會看到這種警告。
那麼如何找到受影響的檢視元素呢?
複習一下,回到storyboard,點選黃色警告,檢視引起問題的檢視元素。可以看到,正是我們剛剛新增到prototype table cell上的新的label導致了問題的出現。
那麼應該如何修復這個問題呢?
其實並不難,只需要選中label,然後從Interface Builder底部選擇Add New Constraints,並新增4個constraints(可以先使用預設的設定值)。
好了,辛苦了這麼久,到了該檢驗成果的時候了~
現在你可以試著編譯執行應用。
然後發現,。。。什麼都沒有改變。
表依然是空的。
這是因為剛才我們只是給表添加了cell的設計,但並沒有提供資料來源rows。
記住一點,cell只是表中cell的視覺呈現元素,⽽並非真實的資料。為了向表中新增資料,我們必須寫⼀些程式碼。
那就是下一課的內容了。
我們下一課再見~
本人聯絡方式:
微信:iseedo
QQ討論群: 375143733
不喜歡用QQ的童鞋可以加我微信,然後請求拉進微信群~
福利時刻~