So basically I can tell that the images are being saved by the system (it shows it on the debug terminal) however whenever I close, and then reopen the app the images firstly aren't there at all but also whenever I search the address name I saved them as... I have tried diagonsing the problem by changing UUID's, changing PNGs to JPGS - no matter what I do it does not show once the application has closed. I think it might have to do with how the image are .HEIF (apple's standard) but I don't have any concrete evidence to back this up. If anyone can help it would be greatly apperciated.
import SwiftUI
import MapKit
import CoreLocation
struct ContentView: View {
@StateObject private var mapAPI = MapAPI()
@State private var text = ""
@State private var locationInfo: String = ""
@State private var showLocationInfo = false
@State private var imageUrls = [String]() // Array to store image URLs
@State private var showImagePicker = false
@State private var showCamera = false
@State private var selectedImage: UIImage?
@State private var images: [UIImage] = []
@State private var selectedImageSourceType: UIImagePickerController.SourceType?
struct ImageInfo: Identifiable {
let id = UUID()
let address: String
let imageUrl: URL
}
...
// Page 2: Photo
VStack {
Spacer()
Menu {
Button(action: {
showImagePicker = true
selectedImageSourceType = .photoLibrary
}) {
Label("Choose from Library", systemImage: "photo")
}
Button(action: {
showImagePicker = true
selectedImageSourceType = .camera
}) {
Label("Take Photo", systemImage: "camera")
}
} label: {
Text("Memories")
.font(.title)
.foregroundColor(.black)
}
.padding()
.sheet(isPresented: $showImagePicker, onDismiss: loadImage) {
ImagePicker(sourceType: selectedImageSourceType ?? .photoLibrary) { image in
selectedImage = image
}
}
if !images.isEmpty {
ScrollView {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 200, maximum: 700))], spacing: 20) {
ForEach(images, id: \.self) { image in
Image(uiImage: image)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(height: UIScreen.main.bounds.height / 5)
.frame(width: UIScreen.main.bounds.width - 60)
.cornerRadius(15)
}
}
.padding()
}
} else {
Text("No photos available")
.foregroundColor(.gray)
}
}
.tabItem {
Image(systemName: "camera")
Text("Memories")
}
.tag(1)
}
.accentColor(.black)
}
@State private var encodedAddress = ""
func fetchLocationInfoFromWikipedia(for address: String) {
guard let encodedAddress = address.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let url = URL(string: "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&exintro=true&explaintext=true&titles=\(encodedAddress)") else {
self.encodedAddress = encodedAddress
return
}
URLSession.shared.dataTask(with: url) { data, _, error in
if let data = data {
if let responseJSON = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
let query = responseJSON["query"] as? [String: Any],
let pages = query["pages"] as? [String: Any],
let page = pages.keys.first,
let pageData = pages[page] as? [String: Any],
let extract = pageData["extract"] as? String {
DispatchQueue.main.async {
self.locationInfo = extract
}
}
}
}
.resume()
}
func openWebsite(_ urlString: String) {
if let encodedAddress = self.text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let url = URL(string: urlString + encodedAddress) {
UIApplication.shared.open(url)
}
}
func loadImage() {
guard let selectedImage = selectedImage else { return }
images.append(selectedImage)
saveImage(selectedImage)
self.selectedImage = nil
}
func saveImage(_ image: UIImage) {
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filename = UUID().uuidString
let fileURL = documentsDirectory.appendingPathComponent(filename)
if let imageData = image.jpegData(compressionQuality: 1.0) {
do {
try imageData.write(to: fileURL)
print("Image saved at: \(fileURL)")
} catch {
print("Error saving image data: \(error.localizedDescription)")
}
}
}
func loadSavedImages() {
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
do {
let fileURLs = try FileManager.default.contentsOfDirectory(at: documentsDirectory, includingPropertiesForKeys: nil, options: [])
let imageFiles = fileURLs.filter { $0.pathExtension == "png" || $0.pathExtension == "png" }
for fileURL in imageFiles {
if let imageData = try? Data(contentsOf: fileURL),
let image = UIImage(data: imageData) {
images.append(image)
}
}
} catch {
print("Error loading saved images: \(error.localizedDescription)")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
I'm a bit confused here; is this your actual/current code?
Because if so, you're filtering out your saved images by only looking at those with the file extension .png, whereas when you save them to disk, you are saving them with no extension at all, just a UUID as the filename.