Contents 非表示
実装
Model
import Foundation
struct Reminder: Identifiable {
let id = UUID()
let title: String
let date: Date
init(title: String, date: Date) {
self.title = title
self.date = date
}
}
View
import SwiftUI
struct HomeView: View {
@StateObject private var viewModel = ReminderViewModel()
@State private var newReminderTitle = ""
@State private var selectedDate = Date()
var body: some View {
NavigationView {
VStack {
if viewModel.notificationStatus == .notDetermined {
Button("Ask for Permission") {
viewModel.requestNotificationPermission()
}
} else if viewModel.notificationStatus == .denied {
Text("Please enable notification permissions in Settings to use the reminder feature.")
.padding()
} else {
List {
Section(header: Text("Reminders")) {
ForEach(viewModel.reminders) { reminder in
HStack {
Text(reminder.title)
Spacer()
Text(formattedDate(reminder.date))
.font(.subheadline)
}
}
.onDelete(perform: deleteReminder)
}
Section {
TextField("Enter reminder", text: $newReminderTitle)
DatePicker("Select Date", selection: $selectedDate, displayedComponents: [.date, .hourAndMinute])
}
Section {
Button("Add Reminder") {
let newReminder = Reminder(title: newReminderTitle, date: selectedDate)
viewModel.scheduleNotification(for: newReminder)
newReminderTitle = ""
}
}
}
.listStyle(InsetGroupedListStyle())
}
}
.navigationTitle("Reminder App")
}
}
private func deleteReminder(at offsets: IndexSet) {
viewModel.reminders.remove(atOffsets: offsets)
}
private func formattedDate(_ date: Date) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .short
return dateFormatter.string(from: date)
}
}
ViewModel
import SwiftUI
import UserNotifications
class ReminderViewModel: ObservableObject {
@Published var reminders: [Reminder] = []
@Published var notificationStatus: UNAuthorizationStatus = .notDetermined
init() {
UNUserNotificationCenter.current().getNotificationSettings { settings in
DispatchQueue.main.async {
self.notificationStatus = settings.authorizationStatus
}
}
}
func requestNotificationPermission() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { granted, error in
DispatchQueue.main.async {
self.notificationStatus = granted ? .authorized : .denied
}
}
}
func scheduleNotification(for reminder: Reminder) {
let content = UNMutableNotificationContent()
content.title = "Reminder"
content.body = reminder.title
content.sound = .default
let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: reminder.date)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
let request = UNNotificationRequest(identifier: reminder.id.uuidString, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
reminders.append(reminder)
}
}