import SwiftUI import os.log public struct ExampleView: View { @StateObject private var mediaUploader = MediaUploader( maxSelection: 5, onUploadComplete: { _ in }, uploadFunction: { media, progress in // 模拟上传进度 for i in 0...10 { try await Task.sleep(nanoseconds: 100_000_000) // 0.1秒 progress(Double(i) / 10.0) } // 这里替换为您的实际上传逻辑 switch media { case .image(let image): // 上传图片 guard let url = URL(string: "https://example.com/images/\(UUID().uuidString).jpg") else { throw NSError(domain: "com.example.app", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL"]) } return url case .video(let url, _): // 上传视频 guard let url = URL(string: "https://example.com/videos/\(UUID().uuidString).mp4") else { throw NSError(domain: "com.example.app", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL"]) } return url } } ) @State private var uploadedURLs: [URL] = [] @EnvironmentObject private var authState: AuthState public init() {} public var body: some View { NavigationView { VStack { // 添加媒体按钮 Button(action: { mediaUploader.showPicker() }) { HStack { Image(systemName: "plus.circle.fill") Text("添加媒体") } .frame(maxWidth: .infinity) .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(8) } .padding(.horizontal) // 媒体上传组件 MediaUploaderView(mediaUploader: mediaUploader) .onChange(of: mediaUploader.selectedMedia) { newValue in if !newValue.isEmpty { Task { if let results = await mediaUploader.startUpload() { let urls = results.map { $0.1 } uploadedURLs.append(contentsOf: urls) } } } } // 显示已上传的URL List(uploadedURLs, id: \.self) { url in Text(url.absoluteString) .font(.caption) .padding(.vertical, 4) } .listStyle(PlainListStyle()) } .navigationTitle("媒体上传示例") } } // 实际上传函数示例 private func uploadMedia(_ media: MediaType, progress: @escaping (Double) -> Void) async throws -> URL { // 模拟上传进度 for i in 0...10 { try await Task.sleep(nanoseconds: 100_000_000) // 0.1秒 progress(Double(i) / 10.0) } // 这里替换为您的实际上传逻辑 switch media { case .image(let image): // 上传图片 return URL(string: "https://example.com/images/\(UUID().uuidString).jpg")! case .video(let url, _): // 上传视频 return URL(string: "https://example.com/videos/\(UUID().uuidString).mp4")! } } } #Preview { ExampleView() .environmentObject(AuthState.shared) }