はじめに
こちらの動画で学習しました。
ソースコード
ViewController.swift
import UserNotifications
import UIKit
class ViewController: UIViewController {
@IBOutlet var table: UITableView!
var models = [MyReminder]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
table.delegate = self
table.dataSource = self
}
@IBAction func didTapAdd() {
//show add vc
guard let vc = storyboard?.instantiateViewController(identifier: "add") as? AddViewController else {
return
}
vc.title = "New Reminder"
vc.navigationItem.largeTitleDisplayMode = .never
vc.completion = { title, body, date in
DispatchQueue.main.async {
self.navigationController?.popToRootViewController(animated: true)
let new = MyReminder(title: title, date: date, identifier: "id_\(title)")
self.models.append(new)
self.table.reloadData()
let content = UNMutableNotificationContent()
content.title = title
content.sound = .default
content.body = body
let targetDate = date
let trigger = UNCalendarNotificationTrigger(dateMatching: Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: targetDate), repeats: false)
let request = UNNotificationRequest(identifier: "some_long_id", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in
if error != nil {
print("something went long")
}
})
}
}
navigationController?.pushViewController(vc, animated: true)
}
@IBAction func didTapTest() {
//fire test notification
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound], completionHandler: { succese, error in
if succese {
//schedule test
self.scheduleTest()
} else if error != nil { //if let error = errorと何が違うの
print("error occurred")
}
})
}
func scheduleTest() {
let content = UNMutableNotificationContent()
content.title = "Hello World"
content.sound = .default
content.body = "My long body. My long body. My long body."
let targetDate = Date().addingTimeInterval(10)
let trigger = UNCalendarNotificationTrigger(dateMatching: Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: targetDate), repeats: false)
let request = UNNotificationRequest(identifier: "some_long_id", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in
if error != nil {
print("something went long")
}
})
}
}
extension ViewController: UITableViewDelegate{
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
table.deselectRow(at: indexPath, animated: true)
}
}
extension ViewController: UITableViewDataSource{
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return models.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = table.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = models[indexPath.row].title
let date = models[indexPath.row].date
let formatter = DateFormatter()
formatter.dateFormat = "MMM, dd, YYYY at hh:mm a"
cell.detailTextLabel?.text = formatter.string(from: date)
return cell
}
}
struct MyReminder {
let title: String
let date: Date
let identifier: String
}
AddViewController.swift
import UIKit
class AddViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var titleField: UITextField!
@IBOutlet var bodyField: UITextField!
@IBOutlet var datePicker: UIDatePicker!
public var completion: ((String, String, Date) -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
titleField.delegate = self
bodyField.delegate = self
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(didTapSaveButton))
}
@objc func didTapSaveButton() {
if let titleText = titleField.text, !titleText.isEmpty,
let bodyText = bodyField.text, !bodyText.isEmpty {
let targetDate = datePicker.date
completion?(titleText, bodyText, targetDate)
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
ほぼそのまま載せるのダメだったらすぐ対応しますので教えていただけるとありがたいです...