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.
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. OK, wenn die Spalte App-Gruppen wie unten gezeigt hinzugefügt wird
Wenn Sie in AppGroups "+" drücken, wird der folgende Dialog angezeigt. Wählen Sie das Entwicklungsteam aus.
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)
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.
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
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.
Damit ist die Vorbereitung für die Verwendung von UserDefaults abgeschlossen.
Dieses Mal werden wir die folgenden Inhalte implementieren.
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")
}
}
}
}
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.
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.
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.
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()
}
}
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
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