iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0

20191009

前言

今天的內容一樣是代辦清單的實作,主要是完成編輯與刪除功能

現在,我們馬上開始!

練習紀錄

TodoList刪除功能

  1. 由於TableView內已經有相關的程式碼,因此我們先取消註解

  1. 加入刪除的程式碼
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,才發現原本顯示資料的陣列,也要同步移除那一筆資料,加上這一行程式碼後,就正常了。

刪除效果

  1. 接者我們來看看刪除的效果,首先在要刪除的那一筆資料,從右邊往左滑

  2. 資料已被刪除 (其實是狀態碼被修改)

  3. 接者透過『Realm Studio』來觀察,發現我們剛剛的測試資料,果然都還在,只是狀態被改為刪除了

TodoList修改功能

  1. 由於這次我們要採用另外一種方式轉換場景,因此刪除原本測試UI用的『segue』

  1. 加入編輯按鈕的事件

  1. 加入編輯按鈕的程式,並用NotificationCenter來傳遞todo物件
@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)    
}
  • 傳遞的名稱是『editNotification』先記下後面要使用
  1. 回到ListTableViewController中,加入接收通知的程式碼
override func viewDidLoad() {
    super.viewDidLoad()
    
    NotificationCenter.default.addObserver(self, selector:
#selector(self.receivedNotification(notif:)), name:
NSNotification.Name(rawValue: "editNotification"),
object: nil)
}
  • 接收的名稱與前一段程式碼相同『editNotification』

  • receivedNotification(notif:) 為收到通知後,所要執行的方法

  1. 接者加入收到通知後的方法
@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

  1. 連結Edit頁面中的Outlet元件,以及建立Button點擊事件

@IBOutlet weak var contentTextField: UITextField!

@IBAction func clearButtonPressed(_ sender: UIButton) {
}

@IBAction func saveButtonPressed(_ sender: UIButton) {
}
  1. 加上更新TodoList資料的程式碼
@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中挖寶。

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


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

[Notificationcenter]

  1. 客製化 NotificationCenter 讓你使用起來更簡單
    https://www.appcoda.com.tw/notificationcenter/

  2. Apple Developer NotificationCenter
    https://developer.apple.com/documentation/foundation/notificationcenter


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

尚未有邦友留言

立即登入留言