[Swift] So zeigen Sie die eingegebenen Zeichen im Widget über UserDefaults an, wenn Sie das WidgetKit verwenden

Letzter Artikel [Swift] Wie man WidgetKit einfach implementiert, hinzugefügt von iOS 14.0 Also habe ich beschrieben, wie man WidgetKit benutzt, Dieses Mal werde ich nach dem Hinzufügen von WidgetKit als Erweiterung beschreiben, wie der Wert über UserDefaults freigegeben wird.

Umgebung

Vorbereitung

1. Fügen Sie AppGroup aus Capability hinzu

Wählen Sie Ziel als Widget-App (das Projekt, aus dem Sie das Widget-Kit hinzugefügt haben) und doppelklicken Sie in Capability auf AppGroup, um die AppGroup hinzuzufügen. スクリーンショット 2020-09-29 11.47.46.png OK, wenn die Spalte App-Gruppen wie unten gezeigt hinzugefügt wird スクリーンショット 2020-09-29 11.58.32.png

2. Registrieren Sie eine gemeinsame Kennung in AppGroups

Wenn Sie in AppGroups "+" drücken, wird der folgende Dialog angezeigt. Wählen Sie das Entwicklungsteam aus. スクリーンショット 2020-09-29 12.02.01.png

b. Sie werden aufgefordert, den von AppGroups verwendeten allgemeinen Bezeichner einzugeben. Geben Sie ihn daher wie folgt ein

group.{Bundle-ID beim Erstellen eines Projekts}.xxxxx

Beispiel) スクリーンショット 2020-09-29 12.00.20.png

※Hinweis

Der xxxxx-Teil kann frei registriert werden. Wenn Sie jedoch zwei oder mehr mit einem Punkt wie xxxxx.yyy verbinden, Bitte beachten Sie, dass bei der Beantragung des App Store ein Fehler angezeigt wird.

Nach dem Drücken von OK ist es OK, wenn die Kennung für AppGroup wie unten gezeigt registriert ist.

3. Fügen Sie App-Gruppen auch auf der Seite der Widget-Erweiterung hinzu

Das Verfahren ist fast das gleiche wie das Verfahren, das wir zuvor durchgeführt haben.

Wählen Sie Ziel (WidgetAppExtension) aus, das als Erweiterung hinzugefügt wurde, und fügen Sie Kapazität> AppGroups hinzu スクリーンショット 2020-09-29 13.19.15.png

b. Drücken Sie die Taste "+", um die allgemeine Kennung in App-Gruppen zu registrieren Diese Seite sollte enden, wenn Sie ein Entwicklerteam auswählen. Anschließend wird die in Schritt 2 hinzugefügte Kennung angezeigt. Aktivieren Sie daher das Kontrollkästchen. スクリーンショット 2020-09-29 12.02.22.png

Damit ist die Vorbereitung für die Verwendung von UserDefaults abgeschlossen.

Implementierung

Dieses Mal werden wir die folgenden Inhalte implementieren.

1. Ordnen Sie Textfelder und Schaltflächen für die Bildschirmeingabe an

ContentView.swift


struct ContentView: View {
    @State private var text = ""
    var body: some View {
        VStack {
            TextField("Zeicheneingabe", text: $text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding(.horizontal)
            Button(action: {
                //Wenn die Taste gedrückt wird
            }){
                Text("Zeichen speichern")
            }
        }
    }
}

2. Fügen Sie UserDefaults einen Sicherungsprozess hinzu

Speichern Sie diesmal den Wert des Textfelds, wenn Sie die Taste drücken

ContentView.swift


struct ContentView: View {
    @State private var text = ""
    var body: some View {
        VStack {
            TextField("Zeicheneingabe", text: $text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding(.horizontal)
            Button(action: {
                //Wenn die Taste gedrückt wird
                let userDefaults = UserDefaults(suiteName: "group.com.sample.yajima.WidgetApp.WidgetExtension")
                if let userDefaults = userDefaults {
                    userDefaults.synchronize()
                    userDefaults.setValue(text, forKeyPath: "inputText")
                }
            }){
                Text("Zeichen speichern")
            }
        }
    }
}

Auf diese Weise können Sie den Wert von UserDefaults freigeben, indem Sie den zuvor in suiteName registrierten Bezeichner angeben. Ich habe auch einen Artikel gesehen, der besagt, dass userDefaults.synchronize () unnötig ist, aber es hat nicht funktioniert, ohne dass ich es hinzugefügt habe.

3. Werterfassungsprozess von UserDefaults

WidgetAppExtension.swift


    // struct Provider:In TimelineProvider
    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []
        /*Nachtrag von hier*/
        var text = ""
        let userDefaults = UserDefaults(suiteName: "group.com.sample.yajima.WidgetApp.WidgetExtension")
        if let userDefaults = userDefaults {
            text = userDefaults.string(forKey: "inputText") ?? ""
        }
        /*Bisher*/
        let currentDate = Date()
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
            let entry = SimpleEntry(date: entryDate)
            entries.append(entry)
        }

        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    }

Geben Sie wie beim Speichern von Werten den Bezeichner für suiteName an. Der Rest entspricht der üblichen Verwendung von UserDefaults.

4. Zeigen Sie den von UserDefaults erhaltenen Wert im Widget an

Wenn Sie nichts aus [vorherigem Artikel] berührt haben (https://qiita.com/yajima_tohshu/items/85e01a19db6cfc16ca92) Ich denke, dass das Standard-Widget den Prozess der Anzeige der Uhrzeit beschreibt Außerdem werde ich versuchen, die Zeichenkette anzuzeigen.

WidgetAppExtension.swift


import WidgetKit
import SwiftUI

struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> SimpleEntry {
        SimpleEntry(date: Date(), text: "")
    }

    func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date(), text: "")
        completion(entry)
    }

    func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []
        var text = ""
        let userDefaults = UserDefaults(suiteName: "group.com.sample.yajima.WidgetApp.WidgetExtension")
        if let userDefaults = userDefaults {
            text = userDefaults.string(forKey: "inputText") ?? ""
        }
        let currentDate = Date()
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
            //Legen Sie die aus UserDefaults erhaltene Zeichenfolge fest
            let entry = SimpleEntry(date: entryDate, text: text)
            entries.append(entry)
        }

        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    }
}

struct SimpleEntry: TimelineEntry {
    let date: Date
    let text: String
}

struct WidgetAppExtensionEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        Text(entry.date, style: .time)
        Text(entry.text)
    }
}

@main
struct WidgetAppExtension: Widget {
    let kind: String = "WidgetAppExtension"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            WidgetAppExtensionEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}

struct WidgetAppExtension_Previews: PreviewProvider {
    static var previews: some View {
        WidgetAppExtensionEntryView(entry: SimpleEntry(date: Date(),text: ""))
            .previewContext(WidgetPreviewContext(family: .systemSmall))
    }
}

Jetzt können Sie die in UserDefaults gespeicherten Werte in WidgetKit anzeigen.

Wenn Sie den Anzeigeinhalt des Widgets sofort nach dem Drücken der Taste aktualisieren möchten

Ein Update ist möglich, indem der folgende Prozess aufgerufen wird, wenn die Taste gedrückt wird.

WidgetCenter.shared.reloadAllTimelines()

ContentView.swift


import SwiftUI
import WidgetKit

struct ContentView: View {
    @State private var text = ""
    var body: some View {
        VStack {
            TextField("Zeicheneingabe", text: $text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding(.horizontal)
            Button(action: {
                //Wenn die Taste gedrückt wird
                //Kennung beim Hinzufügen von AppGroups festgelegt
                let userDefaults = UserDefaults(suiteName: "group.com.sample.yajima.WidgetApp.WidgetExtension")
                if let userDefaults = userDefaults {
                    userDefaults.synchronize()
                    userDefaults.setValue(text, forKeyPath: "inputText")
                }
                //Widget aktualisieren
                WidgetCenter.shared.reloadAllTimelines()
            }){
                Text("Zeichen speichern")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Bewegung

0929gif2.gif

Die auf diese Weise eingegebenen Zeichen werden jetzt in WidgetKit! Ich würde mich freuen, wenn Sie auf Missverständnisse von mir hinweisen könnten.

Wir haben die folgenden Apps mit der Implementierung wie diesem Artikel veröffentlicht. Es fehlen noch Funktionen, aber wenn Sie möchten, installieren Sie es bitte! Accent Widget

Bemerkungen

Die App wurde veröffentlicht! Bitte installieren Sie es, wenn Sie möchten. Toranpo

Ich habe Twitter gestartet! Bitte folgen Sie mir, wenn Sie möchten. @yajima_tohshu

Recommended Posts

[Swift] So zeigen Sie die eingegebenen Zeichen im Widget über UserDefaults an, wenn Sie das WidgetKit verwenden
Hinzufügen von Zeichen zur Anzeige bei Verwendung der link_to-Methode
[Swift] So zeigen Sie an, wann die Quiz-App richtig antwortet [Anfänger]
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
[Rails 5] Anzeigen des Bildschirms zum Ändern des Kennworts bei Verwendung von devise
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
[Schienen] So zeigen Sie Bilder in der Ansicht an
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
[Rails] So zeigen Sie die Wettervorhersage der registrierten Adresse auf Japanisch mit OpenWeatherMap an
So stellen Sie die Chronik ein, wenn sich die Zeit in CentOS7 verschiebt
[Schienen] Anzeigen von Informationen, die in der Datenbank gespeichert sind
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Speichern der im Textbereich eingegebenen Informationen in einer Variablen in der Methode
Anzeigen der in Spring Boot eingegebenen Zeichen im Browser und Referenzlinks [Einführung in Spring Boot / Für Anfänger]
[Ruby on Rails] Beim ersten Anmelden ・ So teilen Sie den Bildschirm mit jQuery in zwei Hälften
Zurückgeben eines Werts vom Modell an den Controller mithilfe des [Swift5] -Protokolls
Ich habe die Punkte zusammengefasst, die bei der kombinierten Verwendung von Ressourcen und Ressourcen zu beachten sind
Versuchen Sie, mit UIViewRepresentable eine leicht reichhaltige Webansicht in SwiftUI anzuzeigen
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So beschränken Sie die Aktion des Übergangsziels, wenn Sie nicht angemeldet sind
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
[Ruby] Gibt Zeichen in Pyramidenform entsprechend der eingegebenen Nummer zurück
So verweisen Sie auf eine Spalte, wenn Sie die Spaltennamensmethode in ActiveRecord überschreiben
[swift5] So legen Sie die Farbe hexadezimal fest
Kürzen Sie die UUID in Swift auf base64.
So erhalten Sie das Datum mit Java
[Swift5] So implementieren Sie Animationen mit "lottie-ios"
So überschreiben Sie Firebase-Daten mit Swift
So zeigen Sie Fehlermeldungen auf Japanisch an
Einbetten und Anzeigen von YouTube-Videos in Rails (Sie können die eingegebene URL auch durch Bearbeiten abrufen).
[Swift] So ermitteln Sie die Anzahl der Elemente in einem Array (Super Basic)
So wird die Abfragezeichenfolge bei Verwendung von PreparedStatement in JDBC tatsächlich ausgegeben
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
So beheben Sie einen Absturz beim Löschen von Realm-Daten in der Liste der schnellen Benutzeroberfläche
[Swift] So ändern Sie die Reihenfolge der Balkenelemente in Tab Bar Controller [Anfänger]
Festlegen, wann in junit "Der Konstruktor Empty () ist nicht sichtbar" auftritt
So zeigen Sie eine Webseite in Java an
So implementieren Sie die Brotkrumenfunktion mit gretel
So löschen Sie die Datenbank beim Neuerstellen der App
Zeigen Sie "Hello World" im Browser mit Java an
Zeigen Sie "Hello World" im Browser mit Java an
So zeigen Sie das Ergebnis des Ausfüllens des Formulars an
So führen Sie Aufgaben parallel zu Swift in Swift Package aus
So erstellen Sie die einfachste Blockchain in Ruby