我是 SwiftUI 的新手。我有 Python 和 Shell 腳本的中級知識。試圖制作一個基本上運行備份作業的應用程式,以將資料從我的 MacOS 復制到網路驅動器。我之前能夠使用 AppleScript 集成 Python 腳本來實作這一點,但現在我正在嘗試使用有趣的視圖實作相同的功能。
使用下面的代碼,我試圖創建一個函式,該函式可以從任何位置(不幸的是在 SwiftUI 中沒有看到 Python 的任何本機解決方案)單擊時呼叫 shell 腳本(更喜歡將腳本存盤在應用程式中)并在視圖視窗上回傳實時輸出. 我正在撰寫的代碼是為 MacOS 而不是為 iPhone 基本上。
任何人都可以請幫助我指導正確的方向。
import SwiftUI
import Foundation
enum ViewState {
case DefaultView
case BackupTaskView
}
struct BackupView : View {
@State var showing : ViewState = .DefaultView
var body: some View {
HeaderView()
VStack {
if showing == .DefaultView {
DefaultView(showing:$showing)
}
if showing == .BackupTaskView {
BackupTaskView(showing:$showing)
}
}
.frame(width: 700, height: .infinity, alignment: .topLeading)
.padding(8)
Spacer()
FooterView()
}
}
private struct DefaultView: View {
@Binding var showing : ViewState
@State var navigated = false
@State var result : String = ""
var body: some View {
VStack {
Text(
"Hello, World!"
)
}
.frame(width: 700, height: .infinity, alignment: .topLeading)
.padding(8)
Spacer()
VStack {
Button(
action: { self.showing = .BackupTaskView }
)
{
Image("backup")
.resizable()
.frame(maxWidth: 180, maxHeight: 180)
}
.buttonStyle(PlainButtonStyle())
}
Spacer()
}
}
private struct BackupTaskView : View {
@Binding var showing : ViewState
@State var result : String = ""
@State var script = "/Users/samiron/Documents/Backup.sh"
@State var isRunning = false
var body: some View {
VStack {
Form {
Section {
Text("\(result)")
}
.onAppear{self.executeCommand()}
}
}
}
func executeCommand() -> (String?) {
let task = Process()
task.launchPath = "/bin/sh"
task.arguments = [ script ]
let pipe = Pipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let result = String(data: data, encoding: .utf8)
task.waitUntilExit()
return result
}
}
struct BackupView_Previews: PreviewProvider {
static var previews: some View {
BackupView()
}
}
uj5u.com熱心網友回復:
我假設你想要一些東西,比如
Section {
Text("\(result)")
}
.onAppear{
self.result = "Executing..."
DispatchQueue.global(qos: .background).async {
let output = self.executeCommand() // << run in background
DispatchQueue.main.async {
self.result = output ?? "Failed" // << update UI on main
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385753.html
