100 Days of SwiftUI(DAY 81(Project16 part 3))

コンテキストメニューの作成
Creating context menus
Long pressに注意!!(context menus)

a context menu is triggered by long-pressing on an item on the screen

//TabView同様にすべての色が削除されるため、3枚すべてが真っ黒な四角形としてレンダリングされます。
//代わりに、次のようにAppleのSFシンボルなどのラインアートアイコンを狙う必要があります。

import SwiftUI

struct ContentView: View {
    @State private var backgroundColor = Color.red

    var body: some View {
        VStack {
            Text("Hello, World!")
                .padding()
                .background(backgroundColor)

            Text("Change Color")
                .padding()
                .contextMenu {
                    Button(action: {
                        self.backgroundColor = .red
                    }) {
                        Text("Red")
                    }

                    Button(action: {
                        self.backgroundColor = .green
                    }) {
                        Text("Green")
                    }
                    //TabView同様にすべての色が削除されるため、3枚すべてが真っ黒な四角形としてレンダリングされます。
                    //代わりに、次のようにAppleのSFシンボルなどのラインアートアイコンを狙う必要があります。
                    Button(action: {
                        self.backgroundColor = .red
                    }) {
                        Text("Red")
                        Image(systemName: "checkmark.circle.fill")
                            .foregroundColor(.red)
                    }
                }
        }
    }
}
//struct ContentView: View {
//  @State private var fontColor = Color.black
//  var body: some View {
//    Text("Long press here to show a context menu")
//      .foregroundColor(fontColor)
//      .contextMenu {
//        Button(action:{
//          self.fontColor = Color.blue
//        }){
//          Text("Set color to blue")
//        }
//        Button(action:{
//          self.fontColor = Color.red
//        }){
//          Text("Set color to red")
//        }
//      }
//  }
//}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}


ユーザーに最高のエクスペリエンスを提供できるように、コンテキストメニューを使用する際のヒントをいくつか紹介します。

それらを使用する場合は、多くの場所で使用してください。何かを押し続けると、何も起こらないことを確認するだけでイライラすることがあります。
オプションのリストはできるだけ短くしてください。3つ以下を目指してください。
ユーザーがUIの他の場所で既に表示しているオプションを繰り返さないでください。
コンテキストメニューは本質的に非表示であるため、コンテキストメニューで重要なアクションを非表示にする前によく考えてください。

通知のスケジュール
Scheduling local notifications

UserNotifications
通知には2つのタイプがあり、それらは作成された場所によって異なります。ローカル通知はローカルでスケジュールする通知であり、リモート通知(一般にプッシュ通知と呼ばれます)はどこかのサーバーから送信されます。
メッセージをAppleのプッシュ通知サービス(APNS)に送信し、ユーザーに転送するため、リモート通知が機能するためにはサーバーが必要です。ただし、ローカル通知は、ユーザーが許可する限りいつでもメッセージを送信できるので、比較すると簡単で便利です。

通知が追加されたら、シミュレーターでCmd + Lを押して画面をロックします。数秒経過すると、デバイスが音で目を覚まし、メッセージを表示します。

import SwiftUI
import UserNotifications

struct ContentView: View {
   

    var body: some View {
        VStack {
            Button("Request Permission") {
                // first 承認の要求
                UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, error in
                    if success {
                        print("All set!")
                    } else if let error = error {
                        print(error.localizedDescription)
                    }
                }
            }

            Button("Schedule Notification") {
                // second
                //コンテンツは表示されるものであり、タイトル、サブタイトル、サウンド、画像などがあります。
                let content = UNMutableNotificationContent()
                content.title = "Feed the cat"
                content.subtitle = "It looks hungry"
                content.sound = UNNotificationSound.default

                // show this notification five seconds from now
                //トリガーは、通知をいつ表示するかを決定し、現在からの秒数、将来の日時、または場所にすることができます。
                let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)

                // choose a random identifier
                //リクエストはコンテンツとトリガーを結合します
                let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

                // add our notification request
                UNUserNotificationCenter.current().add(request)
            }
        }
    }
}


XcodeでのSwiftパッケージの依存関係の追加
Adding Swift package dependencies in Xcode

Xcodeには、Swift Package Manager(SPM)と呼ばれる依存関係マネージャーが組み込まれています。
ダウンロードするバージョンを指示することもできます。つまり、リモートコードが将来変更される場合でも、既存のコードが破損しないことが保証されます。

これを試すために、どのプロジェクトにもインポートできる単純なSwiftパッケージを作成しました。これは、スウィフトのに小さな拡張追加Sequence(種類Array、Set、Dictionary、とさえすべてが準拠の範囲)にすると同時に、ランダムなアイテムの数引き出します。


import SwiftUI
import SamplePackage

struct ContentView: View {
    let possibleNumbers = Array(1...60)
    
    var results: String {
        // more code to come
        let selected = possibleNumbers.random(7).sorted()
        let strings = selected.map(String.init)
        return strings.joined(separator: ", ")
    }
    
    var body: some View {
        Text(results)
    }
}