iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 22
1

20191008

前言

今天的內容一樣是代辦清單的實作,主要是完成清單的畫面與程式碼的結合與呈現,並且把新增後的資料,重新載入呈現

現在,我們馬上開始!

練習紀錄

TodoList清單完成事件

  1. 首先將TableView Cell中的各個元件做連結

@IBOutlet weak var contentLabel: UILabel!
@IBOutlet weak var checkButton: UIButton!
  1. 加入狀態按鈕被點擊的事件
var id:String = ""

// complete todo
@IBAction func checkButtonPressed(_ sender: UIButton) {
    let realm = try! Realm()
    guard let todo =
realm.objects(ToDoList.self).filter("id =
'\(id)'").first else { return }
    let isDone = todo.status == "\(Status.done)"
    let updateStatus = isDone ? "\(Status.ongoing)" :
"\(Status.done)"
    
    try! realm.write {
        todo.status = updateStatus
        todo.endTime = isDone ? nil : Date()
    }
    
    let image = UIImage(named: !isDone ? "Circle1" :
"Circle0")
    checkButton.setImage(image, for: .normal)
}
  • 透過id欄位,來辨別目前修改的資料是那一筆

  • 狀態按鈕被點擊後,修改按鈕圖片,如果是進行中改為完成,如果是完成改為進行中

  • 將資料回寫入Realm資料庫中

  • 打勾為完成,圓圈為進行中

  • 如果Todo清單完成後,會更新endTime時間欄位

  • 內容寫在ListTableViewCell.swift

TodoList清單呈現相關

  1. 首先建立一個變數用來儲存TodoList清單資料
var todoList:[ToDoList] = []
  1. 在viewDidLoad()事件中讀取資料
override func viewDidLoad() {
    super.viewDidLoad()
    let realm = try! Realm()
    todoList = Array(realm.objects(ToDoList.self).filter("status != 'deleted'"))
}
  • 除了被刪除的資料,完成與進行中的資料都取出
  1. 修改呈現資料筆數的方法
override func tableView(_ tableView: UITableView, numberOfRowsInSection section:
Int) -> Int {
            
    return  todoList.count
}
  • 由於Section在本專案中只有一個,直接回傳不修改
  1. 修改Cell回傳的方法,將資料與元件做對應
override func tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for:
indexPath) as! ListTableViewCell
    let index = indexPath.row
    let imageName = todoList[index].status == "\(Status.ongoing)" ? "Circle0" :
"Circle1"
    cell.id = todoList[index].id
    cell.contentLabel.text = todoList[index].content
    cell.checkButton.setImage(UIImage(named: imageName), for: .normal)
    // Configure the cell...
    return cell
}
  • 畫面中的cell id已設定

  • 將cell轉型為自訂的『ListTableViewCell』型別

  • 索引直接使用『indexPath.row』

  • 如果Todo進行中就顯示『Circle0』圖檔,不然就顯示『Circle1』已完成

  • 用『cell.contentLabel.text 』顯示頁面中,Label呈現的content內容

每次顯示頁面前重新讀取資料

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    let realm = try! Realm()
    todoList =
Array(realm.objects(ToDoList.self).filter("status
!= 'deleted'"))
    tableView.reloadData()    
}
  • 主要是用來呈現,新增資料後,重新讀取頁面

完成圖

有點好笑的是一開始真的資料,與假資料設定的一樣,無法辨別。
因此將資料庫內的測試資料,最後面加上一個『*』號來區別

總結

今天我們練習了,List頁面中資料的呈現,並且在新增Todo後,也能夠透過『viewDidAppear』事件,來重新讀取資料並呈現。目前還剩下編輯與刪除尚未實作,將會在明天的文章持續介紹。

此外發現Xcode11.1已經可以更新下載,為了避免之後文章發不出來(大誤),暫時不敢更新

今天的內容就到這邊,感謝讀者們的閱讀。


Github:

https://github.com/chiron-wang/IT30_11

參考資料與延伸閱讀

  1. 深入淺出 iPhone 開發 (使用 Swift4) - WeiWei
    https://www.udemy.com/course/iphone-swift4/

  2. iOS 12 App 開發快速入門與實戰(繁體中文)
    https://www.udemy.com/course/ios-12-app/

  3. 心智圖軟體Xmind
    https://www.xmind.net/

[Realm]

  1. [Swift] Realm.io 資料庫介紹 - 其之一:初探CRUD
    https://ithelp.ithome.com.tw/articles/10183329

  2. Auto increment ID in Realm, Swift 3.0
    https://stackoverflow.com/questions/39579025/auto-increment-id-in-realm-swift-3-0

  3. Realm Studio
    https://realm.io/docs/swift/latest/#realm-studio


上一篇
Day21 待辦清單 (3)
下一篇
Day23 待辦清單 (5)
系列文
iOS App 實作開發新手村36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言