D
duras
Aktives Mitglied
Thread Starter
- Dabei seit
- 02.09.2008
- Beiträge
- 277
- Reaktionspunkte
- 27
Hallo zusammen,
Ich habe vor 3 Wochen mir Swift / SwiftUI angefangen und das ein oder andere Übungsprojekt relativ erfolgreich angegangen. Aktuell hänge ich jetzt aber seit mehreren Tagen an einem Punkt und komme nicht weiter. Vielleicht könnt ihr mir da helfen.
Soweit ich Klassen in Swift verstehe, kann ich von einer Klasse beliebig viele Instanzen haben, wenn ich an einer beliebigen Instanz einen Wert verändere übernehmen alle anderen Instanzen diesen Wert auch. Im Playground klappt das auch wunderbar:
Prima - alles wie erwartet.
Nun versuche ich gerade, eine Dokumenten-Basierte App für MacOS zu schreiben. In Xcode erstelle ich dafür ein neues Projekt, wähle Dokumenten-Basiert aus, und SwiftUI als Oberfläche.
in der von Xcode generierten Document-Class füge ich ein Property hinzu (und mache die Class konform zu Observable-Object)
Als Test habe ich dann noch in der init() dem content einen neuen Wert zugewiesen:
und die Save-Methode entsprechend angepasst:
Wenn ich das Projekt jetzt starte und speichere (reines Textfile) bekomme ich wie zu erwarten ein Textfile mit "Initialized string" (oder, wenn ich die entsprechende Zeile auskommentiere "Start String"). Soweit auch noch gut.
Jetzt will ich die Daten aber natürlich auch vom User verändern lassen. In meiner ContentView mache ich also ein Textfeld, ein Button und ein String - und erstelle die entsprechenden Propertys:
Beim starten ist das TextField dann mit "TextFieldString" gefüllt, der Text unten steht auf "Initialized string" bzw. "Start string".
Drücke ich also den Button, wird der Text unten geupdated und der Inhalt des TextFields steht nun dort. Soweit auch noch logisch. Die Konsole gibt auch "I want to change the string" aus
Nun zum Großen ABER:
Speichere ich das Dokument jetzt, ist in der gespeicherten Textdatei trotzdem nur "Start string" oder "Initialized string" - niemals aber der Wert, den ich vorher mittels Button-Click in die document.content geschrieben habe.
Jemand nen entsprechenden Hinweis, was ich falsch mache? Ich verzweifle hier langsam...
Liebe Grüße
Duras
Ich habe vor 3 Wochen mir Swift / SwiftUI angefangen und das ein oder andere Übungsprojekt relativ erfolgreich angegangen. Aktuell hänge ich jetzt aber seit mehreren Tagen an einem Punkt und komme nicht weiter. Vielleicht könnt ihr mir da helfen.
Soweit ich Klassen in Swift verstehe, kann ich von einer Klasse beliebig viele Instanzen haben, wenn ich an einer beliebigen Instanz einen Wert verändere übernehmen alle anderen Instanzen diesen Wert auch. Im Playground klappt das auch wunderbar:
Diff:
struct this {
var a = "A"
var b = "B"
var c = "C"
mutating func changeB() {
self.b = "E"
}
}
class that {
var a = "A"
var b = "B"
var c = "C"
func changeB() {
self.b = "E"
}
}
var thisVar = this()
let thisVarCopy = thisVar
thisVar.a = "D"
thisVar.changeB()
let thatVar = that()
let thatVarCopy = thatVar
thatVar.a = "D"
thatVar.changeB()
print("This Var -> \(thisVar.a).\(thisVar.b).\(thisVar.c)\n")
// This Var -> D.E.C
print("This Var Copy -> \(thisVarCopy.a).\(thisVarCopy.b).\(thisVarCopy.c)\n")
// This Var Copy -> A.B.C
print("That Var -> \(thatVar.a).\(thatVar.b).\(thatVar.c)\n")
// That Var -> D.E.C
print("That Var Copy -> \(thatVarCopy.a).\(thatVarCopy.b).\(thatVarCopy.c)\n")
// That Var Copy -> D.E.C
Prima - alles wie erwartet.
Nun versuche ich gerade, eine Dokumenten-Basierte App für MacOS zu schreiben. In Xcode erstelle ich dafür ein neues Projekt, wähle Dokumenten-Basiert aus, und SwiftUI als Oberfläche.
in der von Xcode generierten Document-Class füge ich ein Property hinzu (und mache die Class konform zu Observable-Object)
Code:
@Published var content = "Start string"
Als Test habe ich dann noch in der init() dem content einen neuen Wert zugewiesen:
Code:
self.content = "Initialized string"
und die Save-Methode entsprechend angepasst:
Code:
return content.data(using: .utf8) ?? Data()
Wenn ich das Projekt jetzt starte und speichere (reines Textfile) bekomme ich wie zu erwarten ein Textfile mit "Initialized string" (oder, wenn ich die entsprechende Zeile auskommentiere "Start String"). Soweit auch noch gut.
Jetzt will ich die Daten aber natürlich auch vom User verändern lassen. In meiner ContentView mache ich also ein Textfeld, ein Button und ein String - und erstelle die entsprechenden Propertys:
Swift:
struct ContentView: View {
@ObservedObject var document = Document()
@State var textFieldString = "TextFieldString"
var body: some View {
VStack {
TextField("Placeholder", text: $textFieldString)
.frame(maxWidth: .infinity)
Button(action: { self.document.content = self.textFieldString
print("I want to change the string")
} ) {
Text("Click me")
}
Text("\(document.content)")
}
}
}
Drücke ich also den Button, wird der Text unten geupdated und der Inhalt des TextFields steht nun dort. Soweit auch noch logisch. Die Konsole gibt auch "I want to change the string" aus
Nun zum Großen ABER:
Speichere ich das Dokument jetzt, ist in der gespeicherten Textdatei trotzdem nur "Start string" oder "Initialized string" - niemals aber der Wert, den ich vorher mittels Button-Click in die document.content geschrieben habe.
Jemand nen entsprechenden Hinweis, was ich falsch mache? Ich verzweifle hier langsam...
Liebe Grüße
Duras