在我的內容視圖中,我具有檢測用戶何時復制網站地址的功能
內容視圖
@State private var detectedurl = ""
.................
.onAppear {
urlclipboardwatcher()
}
func urlclipboardwatcher() {
let pasteboard = NSPasteboard.general
var changeCount = NSPasteboard.general.changeCount
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { _ in
if let copiedString = pasteboard.string(forType: .string) {
...............
if copiedString.starts(with: "https://") {
detectedurl = copiedString
}
}
}
}
我想將此值傳遞給我的 NewBookmark 視圖中的文本欄位。如何使用粘貼板發生的任何更改更新文本欄位?
struct NewBookmark: View {
@Binding var detectedurl: String
@ObservedObject private var vm: AddNewBookmarkViewModel
init(vm: AddNewBookmarkViewModel, detectedurl: Binding<String>) {
self.vm = vm
self._detectedurl = detectedurl
}
TextField("Enter a URL", text: $vm.url)
// i want the detected url to automatically populate this textfield
Button("Save") {
vm.save()
}.disabled(vm.url.isEmpty)
添加BookMarkViewModel
class AddNewBookmarkViewModel: ObservableObject {
@Published var url: String = ""
.............
func save() {
do {
let myBM = MyBookmark(context: context)
myBM.url = url
try myBM.save()
} catch {
print(error)
}
}
}
uj5u.com熱心網友回復:
Tbh,我不太確定您發布的代碼是如何作業的。但我過去做過類似的事情。也許它有幫助。我基本上所做的是,一個帶有兩個視圖的視圖模型。兩個視圖都保留 viewModel PasteboardViewModel。PasteboardViewModel是一個StateObject通過兩個第二個視圖傳遞的。environmentObject. 并且urlviewModel 中的變數系結到PasteboardView. 因此,每次此 Publisher 更改 TextField 時也會這樣做。
struct ContentView: View {
@StateObject var viewModel: PasteboardViewModel = .init()
var body: some View {
VStack {
.....
PasteboardView()
.environmentObject(viewModel)
}
.onAppear {
viewModel.watchPasteboard()
}
.padding()
}
}
struct PasteboardView: View {
@EnvironmentObject var viewModel: PasteboardViewModel
var body: some View {
TextField(text: $viewModel.url) {
Text("Test")
}
}
}
class PasteboardViewModel: ObservableObject {
@Published var url: String = ""
func watchPasteboard() {
let pasteboard = UIPasteboard.general
var changeCount = UIPasteboard.general.changeCount
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
if let copiedString = pasteboard.string {
if pasteboard.changeCount != changeCount {
self.url = copiedString
changeCount = pasteboard.changeCount
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521060.html
標籤:迅速迅捷文本域
上一篇:如何在異步方法中實作執行緒安全?
