前提
ローカル通知機能付きのTodoリストを作成しています。
ご参照いただきたいファイルは以下2つです。
1.ListView.swift → Todoリストの入力と表示を行うビューファイル
2.NotificationManager.swift → ローカル通知の許可するメソッドと、通知を行うメソッドを内包したクラスを記載したファイル
実現したいこと
TextFieldに入力した内容を、ローカル通知でお知らせできるようにしたい。
※通知にはUserNotifications をインポートして使用しています。
※各Todoの登録はUserDefaultsの機能を使っています。
発生している問題
ListView.swift 内に記述したextension ListViewに
ローカル通知を設定するメソッド「scheduleNotification」を行うボタンを設置しましたが、
このメソッドの引数である以下3つに入れる値の記述方法がわかりません。
todoSubtitle
todoHour
todoMinute
該当のソースコード①(ListView.swift)
swift
1 2 3import SwiftUI 4 5struct ListView: View { 6 @State var newItem: String = "" 7 @State var toDoList: [String] = [] 8 9 @State var selectedValue1: Int = -1 10 @State var selectedValue2: Int = -1 11 12 var body: some View { 13 VStack { 14 15 //新規予定の登録 16 HStack { 17 TextField("新しい予定を入力してください", text: $newItem) 18 .textFieldStyle(RoundedBorderTextFieldStyle()) 19 .frame(width: 300) 20 21 Button { 22 toDoList.append(newItem) 23 newItem = "" 24 UserDefaults.standard.set(toDoList, forKey: "ToDoList") 25 } 26 label: { 27 ZStack { 28 RoundedRectangle(cornerRadius: 5) 29 .frame(width: 50, height: 30) 30 .foregroundColor(.green) 31 32 Text("追加").foregroundColor(.white) 33 } 34 } 35 } 36 37 //登録したTodoのリスト 38 List { 39 ForEach(toDoList, id: \.self) { item in 40 VStack{ 41 HStack{ 42 Text(item) 43 Spacer() 44 } 45 46 todoDatePicker 47 } 48 } 49 } 50 } 51 .onAppear() { 52 NotificationManager.instance.requestAutorization() 53 guard let defaultItem = UserDefaults.standard.array(forKey: "ToDoList") as? [String] 54 else { return } 55 toDoList = defaultItem 56 } 57 } 58} 59 60//通知をする時刻を設定するピッカー 61extension ListView { 62 var todoDatePicker : some View { 63 HStack{ 64 Picker("", selection: $selectedValue1) { 65 ForEach(-1 ..< 24, id: \.self) { hour in 66 VStack{ 67 if hour == -1 { 68 Text("未選択").tag(hour) 69 } else{ 70 Text("\(hour)").tag(hour) 71 } 72 } 73 } 74 } 75 76 Text("時") 77 78 Picker("", selection: $selectedValue2) { 79 ForEach(-1 ..< 60, id: \.self) { minute in 80 81 if minute == -1 { 82 Text("未選択").tag(minute) 83 } else { 84 Text("\(minute)").tag(minute) 85 } 86 } 87 } 88 89 Text("分") 90 91 Button { 92// !!!!!以下のメソッド内の引数の記述がわかりません!!!! 93 94 NotificationManager.instance.scheduleNotification(todoSubtitle: <#T##String#>, todoHour: <#T##Int#>, todoMinute: <#T##Int#>) 95 } label: { 96 Text("に通知") 97 } 98 } 99 } 100} 101 102//ファイルのプレビュー 103struct ListView_Previews: PreviewProvider { 104 static var previews: some View { 105 ListView() 106 } 107} 108
該当のソースコード②(NotificationManager.swift)
swift
1import SwiftUI 2import UserNotifications 3 4class NotificationManager { 5 6 static let instance = NotificationManager() 7 8// 通知の許可 9 func requestAutorization() { 10 let options: UNAuthorizationOptions = [.alert, .sound, .badge] 11 UNUserNotificationCenter.current().requestAuthorization(options: options) { success, error in 12 if let error = error { 13 print("ERROR: \(error)") 14 } else { 15 print("SUCCESS") 16 } 17 } 18 } 19 20// 設定した時・分にローカル通知を行う 21 func scheduleNotification(todoSubtitle: String, todoHour: Int, todoMinute: Int) { 22 23 let content = UNMutableNotificationContent() 24 content.title = "Todoリストからの通知" 25 content.subtitle = todoSubtitle 26 content.sound = .default 27 content.badge = 1 28 29 30 var dateComponents = DateComponents() 31 dateComponents.hour = todoHour 32 dateComponents.minute = todoMinute 33 34 let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true) 35 36 let request = UNNotificationRequest( 37 identifier: UUID().uuidString, 38 content: content, 39 trigger: trigger) 40 UNUserNotificationCenter.current().add(request) 41 } 42}
ListView.swift のプレビュー
試したこと
▼[SwiftUI] SwiftUIのForEach内でBinding変数を渡したい
https://software.small-desk.com/development/2020/04/13/swiftui-foreach-binding/
上記リンクの記事を参考に、ListView.swift ファイルのextension ListView内のForEach部分の記述を
以下配列の変数を宣言した後にall indicesを使って変更してみたのですが、
エラー表示になり解決できておりません。
@State var selectedValues1 = [-1 ..< 24]
Picker("", selection: $selectedValue1) { ForEach(selectedValues1.indices) { hour in VStack{ // ←エラー(Type '()' cannot conform to 'View') if hour == -1 { Text("未選択").tag(hour) } else{ Text("\(hour)").tag(hour) } selectedValue1 = selectedValues1[hour] // ←エラー (Cannot assign value of type 'Range<Int>' to type 'Int') } } }
補足情報
Xcode Version 14.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/15 11:01
2022/12/16 01:08
2022/12/16 10:12
2022/12/20 04:22
2022/12/23 11:08