Импорт изображения путем открытия файлов на iPhone с помощью SwiftUI

#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