今天的內容一樣是代辦清單的實作,主要是完成編輯與刪除功能
現在,我們馬上開始!
override func tableView(_ tableView: UITableView, commit
editingStyle: UITableViewCell.EditingStyle, forRowAt
indexPath: IndexPath) {
if editingStyle == .delete {
let index = indexPath.row
let realm = try! Realm()
todoList =
Array(realm.objects(ToDoList.self
.filter("status != 'deleted'"))
try! realm.write {
// update todolist status to deleted
todoList[index].status = "\(Status.deleted)"
}
todoList.remove(at: index)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
由於『editingStyle == .insert』相關程式碼,本例中沒有用到,直接刪除即可
首先透過index (indexPath.row)找到要刪除的那一筆資料
接者將狀態改為『Status.deleted』
由於本例只是改狀態,並沒有真的刪除資料,想要刪除的讀者可以參考官方文件
ref: https://realm.io/docs/swift/latest/#realm-studio
剛開始忘了加上『todoList.remove(at: index),來移除原本顯示資料的陣列,結果出現了錯誤。
花了些時間debug,才發現原本顯示資料的陣列,也要同步移除那一筆資料,加上這一行程式碼後,就正常了。
接者我們來看看刪除的效果,首先在要刪除的那一筆資料,從右邊往左滑
資料已被刪除 (其實是狀態碼被修改)
接者透過『Realm Studio』來觀察,發現我們剛剛的測試資料,果然都還在,只是狀態被改為刪除了
@IBAction func editButtonPressed(_ sender: UIButton) {
let realm = try! Realm()
guard let todo =
realm.objects(ToDoList.self).filter("id =
'\(id)'").first else { return }
NotificationCenter.default.post(name:
NSNotification.Name(rawValue: "editNotification"),
object: todo)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector:
#selector(self.receivedNotification(notif:)), name:
NSNotification.Name(rawValue: "editNotification"),
object: nil)
}
接收的名稱與前一段程式碼相同『editNotification』
receivedNotification(notif:) 為收到通知後,所要執行的方法
@objc func receivedNotification(notif: Notification) {
guard let editTodo = notif.object as? ToDoList els
return }
let storyBoard : UIStoryboard = UIStoryboard(name:
"Main", bundle:nil)
let editVC =
storyBoar
.instantiateViewController(withIdentifier:
"EditVC") as! EditViewController
editVC.todo = editTodo
self.navigationController?.pushViewController(edit
animated: true)
}
一樣透過navigationController?.pushViewController()方法來轉換場景
因為此時editVC還尚未產生,我們透過SotryBoard來幫忙初始化
EditViewController在StoryBoard上,也別忘了設定一下ID
@IBOutlet weak var contentTextField: UITextField!
@IBAction func clearButtonPressed(_ sender: UIButton) {
}
@IBAction func saveButtonPressed(_ sender: UIButton) {
}
@IBAction func saveButtonPressed(_ sender: UIButton) {
guard let content = taskTextField.text,
let id = todo?.id else { return }
if !content.isEmpty {
let realm = try! Realm()
guard let realmTodo =
realm.objects(ToDoList.self).filter("id ==
'\(id)' and status != 'deleted'").first else {
return }
try! realm.write {
realmTodo.content = content
}
// return List
navigationController?.popViewController(animated:
true)
}
}
今天我們實作了TodoList的編輯與刪除,也練習了在VC的viewDidLoad()事件中,去接收通知,並執行對應的轉換場景方法。
其實同樣的功能,也可以採用『segue』並搭配prepare來達成。要達到效果的方法可能有好幾種,作者本身的習慣是,盡量學習使用不同的方式,來完成同樣的效果。感謝網路發達的現在,讓我們可以隨時請益Google大神,或在Stackoverflow中挖寶。
今天的內容就到這邊,感謝讀者們的閱讀。
https://github.com/chiron-wang/IT30_11
深入淺出 iPhone 開發 (使用 Swift4) - WeiWei
https://www.udemy.com/course/iphone-swift4/
iOS 12 App 開發快速入門與實戰(繁體中文)
https://www.udemy.com/course/ios-12-app/
心智圖軟體Xmind
https://www.xmind.net/
[Realm]
[Swift] Realm.io 資料庫介紹 - 其之一:初探CRUD
https://ithelp.ithome.com.tw/articles/10183329
Auto increment ID in Realm, Swift 3.0
https://stackoverflow.com/questions/39579025/auto-increment-id-in-realm-swift-3-0
Realm Studio
https://realm.io/docs/swift/latest/#realm-studio
[Notificationcenter]
客製化 NotificationCenter 讓你使用起來更簡單
https://www.appcoda.com.tw/notificationcenter/
Apple Developer NotificationCenter
https://developer.apple.com/documentation/foundation/notificationcenter