標籤:

讓不懂編程的人愛上iPhone開發系列2 iOS12+Swift4.2版-Checklists-13

說明:

本系列教程改編自raywenderlich.com中的iOS Apprentice系列,有需要的童鞋請移步到這裡購買英文版原教程:store.raywenderlich.com

歡迎繼續我們的學習。

因為上一節課的新代碼亮瞎了我們的狗眼,所以這一課我們首先需要做的事情就是重現光明~還記得我們提到過,在定義row0item到row4item的時候,它們都是使用ChecklistItem創建的空白對象嗎?這就意味著每一項的默認值都是空白。因此,我們需要為這些變數設置新的屬性。

為此,打開ChecklistViewController.swift,並更改其中的代碼如下:

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading th e view, typically from a nib.

row0item.text = "重溫德容為加盟巴薩寄出投名狀"

row1item.text = "A股暴漲,趕緊去開個科創板的新戶"
row1item.checked = true

row2item.text = "兩會召開中,關注每天的新聞動態"

row2item.checked = true

row3item.text = "學習神奇的AI視頻變臉技術"
row4item.text = "為參加6月的WWDC提前做好準備"
}

好了,再次運行應用,可以看到一切都恢復正常了~

雖然我們成功重現了之前的努力成功,不過似乎到目前為止,我們還是懶人的做法啊,傳說中的數組也沒有用到啊。

使用當前的方法,我們需要為每一行都設置一個ChecklistItem實例變數。這種做法可以滿足當前的需要,不過是不科學的,也是不可取的。特別是當我們將來有N多行數據的時候,這種做法簡直就是自己找虐。雖然說寫完10萬行代碼才算是編程入門的標誌,不過寫10萬行垃圾代碼或許只會給自己帶來頸椎病和腰肌勞損吧。

該是「數組」真正立功的時候了。

打開ChecklistViewController.swift,刪除剛才所定義的所有實例變數,然後改為一個名為items的數組變數:

var items = [ChecklistItem]()

當然,這個代碼看起來似乎更奇怪了~

Don』t panic! 等你習慣了就好。ChecklistItem周圍的方括弧代表這是一個由ChecklistItem類型的對象所組成的數組,僅此而已。而最後的()代表的是我們在創建一個數組的實例對象。具體來說,它會幫我們創建一個空的數組。

接下來修改viewDidLoad方法的代碼如下:

override func viewDidLoad() {

super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let item1 = ChecklistItem()
item1.text = "重溫德容為加盟巴薩寄出投名狀"
items.append(item1)

let item2 = ChecklistItem()
item2.text = "A股暴漲,趕緊去開個科創板的新戶"
item2.checked = true
items.append(item2)

let item3 = ChecklistItem()
item3.text = "兩會召開中,關注每天的新聞動態"
item3.checked = true
items.append(item3)

let item4 = ChecklistItem()
item4.text = "學習神奇的AI視頻變臉技術"
items.append(item4)

let item5 = ChecklistItem()
item5.text = "為參加6月的WWDC提前做好準備"
items.append(item5)
}

上面的代碼看起來應該沒太大難度,只不過在使用每一個ChecklistItem對象之前,我們首先創建(初始化)一個對象,然後再把每一個實例對象添加到數組裡。當所有代碼執行完畢時,items數組中就將包含5個ChecklistItem對象。

這就是我們的新數據模型~

現在我們的數組?面已經包含了所有的行,接下來可以簡化數據源和代理方法了。

更改以下方法:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "ChecklistItem", for: indexPath)
//添加下面的代碼

let item = items[indexPath.row]
let label = cell.viewWithTag(1000) as! UILabel

label.text = item.text
configureCheckmark(for: cell, at: indexPath)
return cell
}

//MARK:- Table View Delegate

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

if let cell = tableView.cellForRow(at: indexPath){
let item = items[indexPath.row]
item.checked = !item.checked
configureCheckmark(for: cell, at: indexPath)

}
tableView.deselectRow(at: indexPath, animated: true)
}

//MARK:- CONFIGURE THE CHECKMARK
func configureCheckmark(for cell: UITableViewCell, at indexPath: IndexPath){

let item = items[indexPath.row]

if item.checked{
cell.accessoryType = .checkmark
}else{
cell.accessoryType = .none
}
}

看起來比以前又臭又長的代碼清爽多了~

在每個方法中我們都用到了同一行代碼:

let item = items[indexPath.row]

使用這?行代碼,我們從數組中請求具備和?編號相同的index的ChecklistItem對象。 而一旦獲取了該對象,我們就可以查看其text和checked屬性,並做?己想做的事情了。即便用戶要添 加100個,1000個,甚至10000個代辦事務清單,上述?法的代碼也不會發生改變,要改變的只是數據模型而已~這就是MVC的妙處。

當然,說到items數組中元素的數量,我們現在還可以把numberOfRowsInSection中的返回值改為數組中的元素數量,而不是一個指定的數字。

更改tableView(_:numberOfRowsInSection:) 方法的代碼如下:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return items.count
}

這樣?來,不但代碼顯得清晰易讀,而且可以處理任意數量的行。這就是array數組的威力。 編譯運?項目,看看效果吧。當然實際上沒有任何變化,只是整個代碼結構更加清晰易讀。

?練習:

試著添加幾行新數據,現在你只需要修改viewDidLoad方法就?了。

好了,今天的學習到此結束,?到了派發福利的時候了。

溫馨提示:笨貓愛編程會員圖文課程(年度),即將上線!

聯繫方式:

  • 微信討論群請先添加個人微信iseedo,說明要加入iOS開發討論
  • QQ討論群:375143733
  • 微信公眾號:icodefun

答疑說明:

有相關的問題請到課程答疑專區提問:icode.fun/ask/forum.php


推薦閱讀:

TAG:iOS開發 |