Datei-öffnen-Dialog stürzt in Swift
Ich würde gerne mit dem Datei-öffnen-Dialogen aus dem NSFilemanager aber mein code stürzt manchmal und manchmal funktioniert, und ich weiß nicht, warum. Manchmal funktioniert es 100%, manchmal ist das Fenster leer ist, manchmal ist der hintergrund hinter dem dialog ist in dem Fenster angezeigt. Wenn ein craash tritt, "signal:SIGABRT" wird angezeigt, in Xcode.
func openfiledlg (title: String, message: String) -> String
{
var myFiledialog: NSOpenPanel = NSOpenPanel()
myFiledialog.prompt = "Öffnen"
myFiledialog.worksWhenModal = true
myFiledialog.allowsMultipleSelection = false
myFiledialog.canChooseDirectories = false
myFiledialog.resolvesAliases = true
myFiledialog.title = title
myFiledialog.message = message
myFiledialog.runModal()
var chosenfile = myFiledialog.URL
if (chosenfile != nil)
{
var TheFile = chosenfile.absoluteString!
return (TheFile)
}
else
{
return ("")
}
}
Was habe ich falsch gemacht? Warum ist es abstürzt?
Die App läuft nicht auf dem Haupt-thread. Ich habe immer einen neuen thread aufmachen, läuft mein Programm. Der Main-Thread nur handels den Bildschirm-Updates von SpriteKit, die ich für meine Programme.
Ich habe gerade gebaut, ein neuer Cocoa-Basierte Anwendung, und lassen Sie die Funktion ausführen, die in den main-Thread und dort klappt es. Wenn ich anfange einen Thread in der Kakao-App stürzt ab, wie im SpriteKit Umgebung.
Muss ich einen neuen thread starten, in das Sprite-Kit die Umwelt, denn die updates werden nicht gemacht, wenn ich mein Hauptprogramm direkt aus dem AppDelegate. Das Hauptprogramm läuft weiter, bis das ganze SpriteKit beendet wird, so habe ich keine chance, meine Arbeit zu tun, in dem Haupt-thread.
Der Absturz tritt in der Zeile mit dem runModal() und dann in "NSSavePanel._spAuxiliaryStorage":
0x7fff84dfec20: movq -0x10c18197(%rip), %rsi ; "_refreshDelegateOptions"
0x7fff84dfec27: movq %rbx, %rdi
0x7fff84dfec2a: callq *%r15
0x7fff84dfec2d: movq -0x10c17ed4(%rip), %rsi ; "_loadPreviousModeAndLayout"
0x7fff84dfec34: movq %rbx, %rdi
0x7fff84dfec37: callq *%r15
0x7fff84dfec3a: movq -0x10b57079(%rip), %r12 ; NSSavePanel._spAuxiliaryStorage <--- Thread 7: signal SIGABRT
0x7fff84dfec41: movq (%rbx,%r12), %rax
0x7fff84dfec45: movq -0x10b5716c(%rip), %rcx ; NSSavePanelAuxiliary._clientSetADirectory
0x7fff84dfec4c: movb (%rax,%rcx), %al
0x7fff84dfec4f: shrb $0x2, %al
0x7fff84dfec52: andb $0x1, %al
0x7fff84dfec54: xorb $0x1, %al
0x7fff84dfec56: movzbl %al, %ecx
0x7fff84dfec59: movq -0x10c18310(%rip), %rsi ; "_configureForDirectory:forceDefault:"
0x7fff84dfec60: movq %rbx, %rdi
0x7fff84dfec63: xorl %edx, %edx
0x7fff84dfec65: callq *%r15
0x7fff84dfec68: movq -0x10c2d767(%rip), %rsi ; "drain"
0x7fff84dfec6f: movq %r14, %rdi
0x7fff84dfec72: callq *%r15
0x7fff84dfec75: movq (%rbx,%r12), %rsi
In das Terminal-Fenster wird angezeigt:
CocoaTest(54483,0x106f78000) malloc: *** error for object 0x60800017efc0: Heap corruption detected, free list canary is damaged
Jede Idee, wie dieses problem zu lösen, ohne es innerhalb der main-thread?
- auf die Linie macht es crash? könntest du einen stacktrace? haben Sie rufen Sie es auf der main-thread? ist Ihre app-Sandboxen und / oder signiert werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Einschränkungen des User Interface (UI) - Aufrufe, die nicht Thread-Save, können gelöst werden, wenn Sie den folgenden code verwenden, führt einen block von Befehlen in der Haupt-thread asynchron:
So schreiben Sie eigene Funktionen für jedes built-in-Funktion, die nicht thread-save, wie dies (z.B. mit dem Datei-öffnen-dialog):
Bitte beachten Sie, dass der block heißt asynchron, das bedeutet, dass Sie haben zu prüfen, ob der block wurde bearbeitet und abgeschlossen ist oder nicht. Also habe ich noch eine boolean-variable "Haushaltsrede", die zeigt, wenn der block kommt zu seinem Ende. Ohne das bekommst du nicht den Pfadnamen, aber nur eine leere Zeichenfolge.
Wenn Sie interessiert sind, werde ich nach meinen "savefiledialog" -Funktion, zu. Bitte hinterlassen Sie einen Kommentar, wenn so.
Meisten die User-Interface (UI) - Aufrufe sind nicht Thread-Save, das bedeutet, dass Sie nur funktionieren, ohne crash und ungewöhnliches Verhalten in der main-thread.
Dies ist das problem mit NSOpenPanel Fordert auch. Beim Aufruf aus der main-thread ist alles OK.