Bin blutiger Anfänger: Path Control auslesen

uhlhorn

uhlhorn

Aktives Mitglied
Thread Starter
Dabei seit
24.05.2005
Beiträge
2.474
Reaktionspunkte
129
Moin!
(Gibt es keinen Bereich für Appentwicklung für den Mac?!? Aber das ist ja eh gleich …)

Ich habe gestern angefangen in Xcode zu experimentieren und komme nicht weiter. Ich habe ein Objekt „Path Control“ und kann es nicht auslesen. Ich habe nämlich ein Path Control und einen Button. Nachdem ich ein Pfad eingestellt habe, will ich bei einem Klick auf den Button den Pfad an eine Variable übergeben. Anschließend will ich den Pfad so umbauen, dass ich ihn an ein Terminal-Befehl anhängen kann. (Kann man hier kein Source Code einfügen?)

Hier habe ich einen Code-Schnipsel der aber nicht funktioniert:

@IBAction func Startbutton(_ sender: Any) {
//Quellpfad auslesen und ausgeben
let Quelle:String = Quellpfad.stringValue
print(„ausgelesen: \(Quelle))")
}

Ich bekomme die Fehlermeldung:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Ich wüsste zu gerne, was da falsch ist. Mit „unwrapping an Optional value“ kann ich irgendwie gar nichts anfangen.

Zu meinem Hintergrund:
Ich habe als Kind in den 80 und 90er-Jahren viel BASIC programmiert, später auch Assembler auf dem 6502 und ARexx auf dem Amiga, Heutzutage ab und an mal ganz wenig HTML, PHP, Applescript und so. Also nur, wenn ich das mal für irgendetwas persönliches benötige. Swift kenne ich noch gar nicht, finde den Syntax aber um Welten besser als von Applescript.
 
Ach, unter Betriebsysteme?!? Ich hatte nur iOSApp Entwickler für iOS gefunden. Danke für den Hinweis. :)
Vielleicht kann das ein Admin dorthin verschieben. Andererseits dürfte das in iOS dasselbe sein.
 
Bester Kurs wo gibt. Kurzweilig und ausgesprochen gute Einsichten in Swift 4:




Nachtrag: auf iTunes U gibt es auch die Homework - Aufgaben und Slides...
 
  • Gefällt mir
Reaktionen: uhlhorn
Danke für die Schulung. Dieser Hinweis ist wertvoll für mich. Ich weiß es wirklich zu schätzen.

Allerdings ist das ja alles irgendwie keine Antwort auf meine Frage. ;-) Es kann natürlich auch sein, das das keiner von Euch weiß – dafür hätte ich auch Verständnis. Man kann eben nicht alles wissen. In diesem Fall müsste ich mich tatsächlich erst durch stundenlang durch Videos quälen, nur um diese eine Frage beantworten zu können. Oder ich mache es eben doch alles von Hand statt ein kleines Progrämmchen dafür zu schreiben.
 
Sieht so aus als wäre ein Outlet nicht gesetzt - die sind etwas gemein, die werden später erst (ich meine in viewWillAppear) gesetzt. Du müsstest hier checken ob das Optional (Outlet) gesetzt oder nil ist.

„unwrapping an Optional value“ bedeutet auf C oder Java umgelegt: eine Optional ist nicht gesetzt (Optionals sind im Prinzip Variablen, die entweder einen zugeordneten Wert haben oder nil sind). Entspricht einem Zugriff auf einen nicht gesetzten Pointer (in C) oder Nullpointer Exception in Java.

Wenn du mit Optionals nix anfangen kannst.. Zieh dir Paul Hegarty rein, der erklärt das wunderbar.
Und ohne Optionals (und App Life Cycle Management) kannst du App Development auf iOS weitgehend vergessen :)

Ich kann deinem Code nicht ganz folgen.
Woher stammt der Quellpfad?
 
  • Gefällt mir
Reaktionen: uhlhorn
Oh, stimmt, der ist gebrochen. Danke! :) Ich korrigiere das mal …
 
Ah, es tut sich was! :) Allerdings erhalte ich keinen Pfad sondern
ausgelesen: file:///.file/id=6571367.34496198/
Gut, dann muss ich da noch mal ein bisschen googeln, wie ich einen Pfad daraus erhalte.
 
  • Gefällt mir
Reaktionen: Loki M
Hmm, wenn ich in XCode ein Testfile vorgebe, wird der Pfad korrekt ausgelesen. Ziehe ich anschließend das Testfile in den Pfad hinein und lese noch mal aus, bekomme ich eine FileID und nicht mehr den Pfad. Das finde ich sehr irritierend!

In Xcode als default vorgegeben:
Screenshot 2018-12-09 22.07.58.png


So sieht es im Storyboard aus:
Screenshot 2018-12-09 22.08.07.png


So sieht es im kompilierten Programm aus, bevor ich irgendein File hineingezogen habe:
Screenshot 2018-12-09 22.08.28.png


Lese ich das Path Control Object aus, erhalte ich:
file:///Users/gerhard/documents/Testfile.m4a

Ziehe ich aber dieselbe Testdatei in das Path Control Object hinein und lese anschließend noch mal aus, dann erhalte ich stattdessen:
file:///.file/id=6571367.34704030

Und ich verstehe nicht warum! :-(
Und ich habe bisher keinen Kursus und keine Website gefunden, wo der Grund dafür genannt wird.
 
Hier habe ich etwas gefunden, doch das bezieht sich wohl auf eine andere Sprache:

All of the following entries are valid references to a file called MyFile.txt in a user’s Documents directory:
  • Path-based URL: file://localhost/Users/steve/Documents/MyFile.txt
  • File reference URL: file:///.file/id=6571367.2773272/
  • String-based path: /Users/steve/Documents/MyFile.txt
Quelle: Accessing Files and Directories
 
Ich glaube dein Problem steht in dem verlinkten Artikel:

Path-based URL: file://localhost/Users/steve/Documents/MyFile.txt
File reference URL: file:///.file/id=6571367.2773272/
String-based path: /Users/steve/Documents/MyFile.txt


Du kriegst also in dem genannten Beispiel einmal eine Path-based URL und einmal eine File reference URL. Selber Pfad, andere Repräsentation.

Siehe auch hier: https://developer.apple.com/documentation/foundation/nsurl

Die andere Sprache ist übrigens Objective-C. Das hat aber insofern keine Relevanz, da die meisten unterliegenden Frameworks in Objective-C geschrieben sind; du kannst bzw. hast ohnehin keine andere Wahl als die von den entsprechenden Frameworks/Klassen bereitgestellte API von Swift aus aufrufen.
In der Regel gibt es ein kostenfreies Bridging von Objective-C nach Swift; das erkennst du durch das Keyword @objc (zB bei Selektoren) bzw. meist wenn irgendwo ein Parameter des Typs "Any" eingesetzt wird; "Any" ist sozusagen ein Platzhalter für ein Optional, das es in Objective-C nicht gibt.
Man erkennt Objective-C Klassen idR am Präfix "NS" - wie hier zb NSURL. Diese Klassen gehen zurück auf NextSTEP, was historisch die Basis von Mac OS X ist.

Der Kurs von Paul Hegarty sei dir nochmal ans Herz gelegt. Gibt eine tolle Grundlage
 
Zuletzt bearbeitet:
Du kriegst also in dem genannten Beispiel einmal eine Path-based URL und einmal eine File reference URL. Selber Pfad, andere Repräsentation.
Ja, genau. Doch ich weiß nicht warum. Und man findet in Google leider auch nicht viel dazu. Wenn ich in Google nach

Swift "Path-based URL" "File reference URL" "String-based path“

suche, finde ich gerade 6 Suchergebnisse. Nichts ist dabei was helfen könnte. Bei

Swift convert "File reference URL" "String-based path“

ist es nicht besser.

Und die ganzen Dokumentationen von Apple sind wie chinesisch für mich. Davon verstehe ich nichts und es sind auch keine nachvollziehbaren Beispiele dabei.

Ich habe schon alles Mögliche probiert (siehe Auskommentierungen).

@IBAction func Startbutton(_ sender: Any) {
//Quellpfad auslesen
//let FileID:String = Quellpfad.stringValue
let FileID:String = Quellpfad.stringValue // führt zu einer fileID
//let FilePath = CFURLGetFileSystemRepresentation(FileID)
//let FilePath: String = String(contentsOf: FileID)
//let FilePath = (string as NSString).FileID
//let FilePath = URL(fileURLWithPath: FileID).lastPathComponent
//let FilePath:String = FileID.path
//let FilePath:String = fileURL(withPath, path: FileID)
print("ausgelesen: \(FileID)")
//print("ausgelesen: \(FilePath)")
}
 
Wo ist das Quellpfad.stringValue her?
 
von
@IBOutlet weak var Quellpfad: NSPathControl!
„Quellpfad“ ist ein Path Control Objekt (siehe Screenshots) im Programmfenster, wo der Benutzer einen Pfad auswählen kann.
 
NSPathControl hat ein property url: URL welches wiederum ein Member absoluteString: String hat?

https://developer.apple.com/documentation/appkit/nspathcontrol

sowas wie
if let quellPfadString = Quellpfad?.url?.absolueString? (mit optional chaining)

übrigens, als Konvention: Variablen zbw. Properties in Camel Case.

Statt Quellpfad also quellPfad, filePath statt FilePath, etc. Ist zwar nicht falsch im eigentlichen Sinne, aber schwierig zu lesen weil man nicht weiss was Typen und was Variablen sind.

Daher:

Typen (wie Klassen, Structs, etc): Grossgeschrieben, zB NSURL, MyClass, MyStruct)
Vars und Properties Camel Case: myURL, myClassInstance, myInt, etc
 
Das Problem ist leider, dass ich diese Dokumentationen nicht verstehe. Ich habe nun schon seit Tagen Videos zu Swift angesehen, aber nirgends wird einem erklärt, wie man diese Dokumentationen zu lesen hat.

Deine verlinkte Seite hatte ich auch schon gefunden. Auf der steht zwar eine Deklaration (mit der ich leider nichts anfangen kann, denn ich weiß nicht, was das bedeutet) und eine Übersicht. Es gibt aber kein Beispiel, wo das mal konkret gezeigt wird.
 
Ein Beispiel:

@IBAction func gradeButtonPressed(_ sender: Any) {
if let button = sender as? UIButton {
if let operandString = button.titleLabel!.text {
if let operand = Double(operandString) {
( ... )
}
}
}
}

Hier sieht man;

1 if let button = sender as? UIButton:
Variable button wird von Any (unbekannter Typ) gecastet auf UIBUtton

2 f let operandString = button.titleLabel!.text
UIButton hat eine Variable titleLabel, welches wiederum eine Variable text hat. So chaint man Objekte, die ggf. Objekte beinhalten.

Du hast keine Erfahrung mit objektorientierter Programmierung? Java, oder C++?

Nochmal: beginne einfach mit dem Kurs von Paul Hegarty. Zumindest die Grundlagen der objektorientierten Programmierung solltest du schon draufhaben, sonst wird es schwierig
 
Hmm, bekomme jede Menge Fehler …
Screenshot 2018-12-10 01.24.52.png
 
Zurück
Oben Unten