I am trying to preview my video before its uploaded the same way the imageview is being on display to be preview
I am not able to display my selected video in screen as preview because of these errors.
‘nil’ requires a contextual type
viewModel.selectedImage = nil
‘nil’ cannot be assigned to type ‘[Video]’
viewModel.videos = nil
I need to display my selected video as preview, just like my preview of the image is being shown in my above image.
This is my code
.onChange(of: viewModel.selectedImage) { result in
Task {
do {
if let data = try await viewModel.selectedImage?.loadTransferable(type: Data.self) {
if let uiImage = UIImage(data: data) {
self.uiImage = uiImage
if let url {
}
}
}
} catch {
print(error.localizedDescription)
viewModel.selectedImage = nil
.onChange(of: viewModel.videos) { result in
Task {
do {
if let data = try await viewModel.videos {
VideoPlayer(player: AVPlayer(url: url!))
}
} catch {
print(error.localizedDescription)
viewModel.videos = nil
}
}
import SwiftUI
import PhotosUI
import Kingfisher
import AVKit
struct CreateView: View {
@State private var selectedPhoto: PhotosPickerItem?
@State private var image: Image?
@State var captionText = ""
@State var imagePickerPresented = false
@StateObject var viewModel = UploadPostViewModel()
@Environment(\.dismiss) var dismiss
@State var uiImage: UIImage?
@Binding var tabIndex: Int
@State var url: URL?
private var user: Users? {
return UserService.shared.currentUser
}
var body: some View {
NavigationStack {
ZStack{
(LinearGradient(gradient: Gradient(colors: [Color.white, Color.gray]), startPoint: .top, endPoint: .bottom))
.ignoresSafeArea()
VStack {
HStack(alignment: .top) {
RectangularImageSize( size: .small)
VStack(alignment: .leading, spacing: 4) {
Text(user?.username ?? "")
.fontWeight(.semibold)
TextField("Type Something", text: $viewModel.text, axis: .vertical)
Spacer()
}
.font(.footnote)
if !viewModel.text.isEmpty {
Button {
viewModel.text = ""
} label: {
Image(systemName: "xmark")
.resizable()
.frame(width: 12, height: 12)
.foregroundColor(.gray)
Button(action: {
viewModel.selectedImage = nil
}, label: {
Image(systemName: "xmark")
.resizable()
.scaledToFit()
.frame(width: 10, height: 10)
.padding(8)
})
.background(Color(.gray))
.foregroundColor(.white)
.clipShape(Circle())
}
.padding(8)
Spacer()
} else {
if viewModel.text.isEmpty {
PhotosPicker(
selection: $viewModel.selectedImage,
matching: .any(of: [.images,.videos, .not(.livePhotos)]),
photoLibrary: .shared()) {
Image(systemName: "photo")
}
}
}
Spacer()
}
.padding()
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("Cancel") {
dismiss()
}
.font(.subheadline)
.foregroundStyle(Color.black)
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("Post") {
Task {
try await viewModel.uploadPost(caption: captionText)
dismiss()
}
}
.opacity(viewModel.text.isEmpty ? 0.5 : 1.0)
.disabled(viewModel.text.isEmpty)
.font(.subheadline)
.fontWeight(.semibold)
.foregroundStyle(Color.green)
}
}
.onDisappear { tabIndex = 0 }
}
Divider()
if uiImage != nil {
Image(uiImage: uiImage!)
.resizable()
.scaledToFit()
.frame(width: 200, height: 200)
}
}
.onChange(of: viewModel.selectedImage) { result in
Task {
do {
if let data = try await viewModel.selectedImage?.loadTransferable(type: Data.self) {
if let uiImage = UIImage(data: data) {
self.uiImage = uiImage
if let url {
}
}
}
} catch {
print(error.localizedDescription)
viewModel.selectedImage = nil
.onChange(of: viewModel.videos) { result in
Task {
do {
if let data = try await viewModel.videos {
VideoPlayer(player: AVPlayer(url: url!))
}
} catch {
print(error.localizedDescription)
viewModel.videos = nil
}




