在這一篇中,我們要來介紹 AddAlarmViewController 的上半部分,包含 畫面初始化、UI 設定、鬧鐘儲存與更新,並透過程式碼一步步拆解。
import UIKit
import RealmSwift
protocol AddAlarmViewControllerDelegate: AnyObject {
func didAddNewAlarm()
func didUpdateAlarm()
func didDeleteAlarm()
}
class AddAlarmViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var DatePicker: UIDatePicker!
@IBOutlet weak var tbvAddAlarm: UITableView!
@IBOutlet weak var btnDelete: UIButton!
weak var delegate: AddAlarmViewControllerDelegate?
var repeatDays: [Bool] = Array(repeating: false, count: 7)
var selectedSound: String = ""
var alarmname: String = ""
var alarmToEdit: AlarmData?
var snoozeEnabled: Bool = true
override func viewDidLoad() {
super.viewDidLoad()
tbvAddAlarm.delegate = self
tbvAddAlarm.dataSource = self
tbvAddAlarm.register(UINib(nibName: "AddAlarmTableViewCell", bundle: nil), forCellReuseIdentifier: "AddAlarmTableViewCell")
setUI()
setupTextFieldDelegate()
if let alarm = alarmToEdit, !alarm.isInvalidated {
repeatDays = Array(alarm.repeatDays)
selectedSound = alarm.sound
alarmname = alarm.name
snoozeEnabled = alarm.snoozeEnabled
if let date = formatStringToDate(alarm.alarmTime) {
DatePicker.date = date
}
}
}
func setUI() {
DatePicker.locale = Locale(identifier: "zh_TW")
title = alarmToEdit == nil ? "加入鬧鐘" : "編輯鬧鐘"
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "儲存", style: .plain, target: self, action: #selector(doneTapped))
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", style: .plain, target: self, action: #selector(cancelTapped))
btnDelete.isHidden = alarmToEdit == nil
btnDelete.setTitle("刪除鬧鐘", for: .normal)
btnDelete.setTitleColor(.red, for: .normal)
btnDelete.addTarget(self, action: #selector(deleteTapped), for: .touchUpInside)
}
func saveNewAlarm() {
let realm = try! Realm()
let newAlarm = AlarmData(
alarmTime: formatDate(DatePicker.date),
creatTime: getSystemTime(),
name: alarmname,
repeatDays: repeatDays,
sound: selectedSound,
snoozeEnabled: snoozeEnabled
)
try! realm.write { realm.add(newAlarm) }
scheduleNotification(for: newAlarm)
delegate?.didAddNewAlarm()
self.dismiss(animated: true, completion: nil)
}
func updateAlarm(_ alarm: AlarmData) {
let realm = try! Realm()
try! realm.write {
alarm.alarmTime = formatDate(DatePicker.date)
alarm.name = alarmname.isEmpty ? "鬧鐘" : alarmname
alarm.repeatDays.removeAll()
alarm.repeatDays.append(objectsIn: repeatDays)
alarm.sound = selectedSound
alarm.snoozeEnabled = snoozeEnabled
}
scheduleNotification(for: alarm)
delegate?.didUpdateAlarm()
self.dismiss(animated: true, completion: nil)
}
@objc func deleteTapped() {
guard let alarm = alarmToEdit else { return }
let realm = try! Realm()
try! realm.write { realm.delete(alarm) }
delegate?.didDeleteAlarm()
self.dismiss(animated: true, completion: nil)
}
到這裡,我們已經完成 UI 初始化 與 基本資料操作(新增、更新、刪除)。
下一篇(Day19)將介紹 TableView 顯示、頁面跳轉、通知排程與 Delegate 回傳。