我遵循了有關從用戶選擇的檔案中獲取 Url 并能夠在視圖上顯示它的教程。我現在的問題是我想將這些 Url 添加到一個陣列中。然后從陣列中獲取專案并將它們列印到視圖上。它的作業方式是用戶按下一個按鈕,然后會彈出一個帶有檔案應用程式的作業表。用戶可以在那里選擇一個檔案。用戶選擇檔案后,Url 將列印在視圖上。列印網址是使用這個
//if documentUrl has an Url show it on the view
If let url= documentUrl{
Text(url.absoluteString)
}
問題是當我做同樣的事情時
If let url= documentUrl
在將 Url 添加到陣列并且應用程式崩潰之前運行
這是完整的代碼
//Add the Urls to the array
class Article: ObservableObject{
var myArray:[String] = []
}
struct ContentView: View {
@State private var showDocumentPicker = false
@State private var documentUrl:URL?
@State var myString:URL?
@ObservedObject var userData:Article
// Func for onDismiss from the Sheet
func upload() {
// add the Url to the Array
DispatchQueue.main.async{
userData.myArray.append(documentUrl!.absoluteString)
}
}
var body: some View {
VStack{
//If have Url reflect that on the View
if let url = documentUrl{
//Works
Text(url.absoluteString)
//doesntwork
Text(userData.myArray[0])
}
}
Button(action:{showDocumentPicker.toggle()},
label: {
Text("Select your file")
})
.sheet(isPresented: $showDocumentPicker, onDismiss: upload )
{
DocumentPicker(url: $documentUrl)
}
}
}
我想做的主要事情是在用戶選擇檔案或作業表消失后將 ulrs 顯示到視圖中。因此,如果用戶選擇 1 Url,則只會列印一個。如果在之后選擇了另一個,則顯示 2 個等等。這是用于選擇檔案的 documentPicker 代碼
struct DocumentPicker : UIViewControllerRepresentable{
@Binding var url : URL?
func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
//initialize a UI Document Picker
let viewController = UIDocumentPickerViewController(forOpeningContentTypes: [.epub])
viewController.delegate = context.coordinator
print("1")
return viewController
}
func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) {
print("Swift just updated ")
print("2")
}
}
extension DocumentPicker{
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator:NSObject, UIDocumentPickerDelegate{
let parent: DocumentPicker
init(_ documentPicker: DocumentPicker){
self.parent = documentPicker
}
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let url = urls.first else{return}
parent.url = url
print("3")
}
}
}
不確定我是否沒有以正確的方式接近這個?我查看了不同的教程,但找不到任何內容。
uj5u.com熱心網友回復:
可觀察物件沒有更改觸發器。要通知可觀察物件已更改,請使用以下示例之一:
class Article: ObservableObject {
@Published var myArray:[String] = []
}
或者
class Article: ObservableObject {
private(set) var myArray:[String] = [] {
willSet {
objectWillChange.send()
}
}
func addUrl(url: String) {
myArray.append(url)
}
}
官方檔案:https : //developer.apple.com/documentation/combine/observableobject
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381138.html
