#swift #image #swiftui
#swift #изображение #swiftui
Вопрос:
То, что я пытаюсь сделать, это импортировать изображение, открыв файл на iPhone, и сделать так, чтобы это изображение отображалось с ContentView
Image(uiImage: self.img)
помощью сохранения изображения в img
переменной.
С помощью этого видео на YouTube текущий код может открывать файлы и выбирать изображение, а также может получать имя файла изображения, но мне не удается сохранить его в img
переменную. Кажется, проблема в том, что все, что я могу получить, это просто URL файла изображения, а не данные изображения.
Как я могу этого добиться?
Вот текущий код
import SwiftUI
import UniformTypeIdentifiers
struct ContentView: View {
@State var fileName = ""
@State var openFile = false
@State var img = UIImage()
var body: some View {
VStack(spacing: 25){
//file name of the image
Text(fileName).fontWeight(.bold)
//showing the image opend
Image(uiImage: self.img)
Button(action:{
openFile.toggle()
}){
Text("Open")
}
}.fileImporter(isPresented: $openFile, allowedContentTypes: [.image]) { (res) in
do{
let fileUrl = try res.get()
print(fileUrl)
self.fileName = fileUrl.lastPathComponent
} catch{
print("Error happend")
}
}
}
}
struct Doc : FileDocument {
var url: String
static var readableContentTypes: [UTType]{[.audio]}
init(url : String) {
self.url = url
}
init(configuration : FileDocumentReadConfiguration) throws {
url = ""
}
func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
let file = try! FileWrapper(url: URL(fileURLWithPath: url), options: .immediate)
return file
}
}
Ответ №1:
Я предполагаю, что вы хотели этого
do{
let fileUrl = try res.get()
print(fileUrl)
self.fileName = fileUrl.lastPathComponent
fileUrl.startAccessingSecurityScopedResource()
if let imageData = try? Data(contentsOf: fileUrl),
let image = UIImage(data: imageData) {
self.img = image
}
fileUrl.stopAccessingSecurityScopedResource()
} catch{
print("Error happend")
}
Комментарии:
1. Спасибо @Asperi, это сработало идеально для загрузки изображения! Однако я до сих пор не понял, как сохранить основные данные, поскольку img — это UIImage (), а основные данные необходимо сохранять как данные. Новая идея, как сохранить как данные? пусть newItem = Item(контекст: viewContext) newItem.id = UUID() // исправьте меня: нужно сохранить изображение как данные, а не UIImage newItem. img = self.img