Swiftui 如何在用户从照片库中选择图像时显示其他视图
我的问题是,我无法在另一个视图中显示所选图像,因为我无法将变量Swiftui 如何在用户从照片库中选择图像时显示其他视图,swiftui,Swiftui,我的问题是,我无法在另一个视图中显示所选图像,因为我无法将变量selected设置为true 我的变量: @State private var selectedImage: UIImage? @State private var isImagePickerDisplay = false @State private var selected: Bool = false 步骤1-我向用户展示ImagePicker(工作正常): 第2步-我找不到正确的方法来知道用户何时实际选择了图像。我试着这样做
selected
设置为true
我的变量:
@State private var selectedImage: UIImage?
@State private var isImagePickerDisplay = false
@State private var selected: Bool = false
步骤1-我向用户展示ImagePicker(工作正常):
第2步-我找不到正确的方法来知道用户何时实际选择了图像。我试着这样做:
if selectedImage != nil {
selected = true
}
但我得到了一个错误:
类型“()”不能与“视图”一致;只有结构/枚举/类类型才能符合协议
第3步-如果用户实际从照片库中选择了图像,则我的计划是显示另一个视图:
.fullScreenCover(isPresented: $selected) {
EditView(selectedImage: $selectedImage)
}
请记住,我是SwiftUI的新手。我刚刚完成了教程,现在我正试图自己开发一个项目
编辑(添加了我的整个ContentView()):
可能的解决办法
struct ContentView: View {
private enum SheetType {
case pickImage, showImage
}
@State private var selectedImage: UIImage?
@State private var selected: Bool = false
@State private var currentSheetType: SheetType = .pickImage
var body: some View {
Button(action: {
self.selected.toggle()
self.currentSheetType = .pickImage
}) {
Image(systemName: "plus")
.renderingMode(.original)
.font(.system(size: 16, weight: .medium))
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.background(Color(.white))
.clipShape(Circle())
.shadow(radius: 10)
}
.sheet(isPresented: self.$selected) {
if currentSheetType == .pickImage {
if selectedImage != nil {
self.selected.toggle()
self.currentSheetType = .showImage
}
}
} content: {
if currentSheetType == .pickImage {
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
} else if currentSheetType == .showImage {
EditView(selectedImage: $selectedImage)
}
}
}
}
也许你想要这个
struct DFContentView: View {
@State private var selectedImage: UIImage?
@State private var isImagePickerDisplay = false
@State private var selected: Bool = false
var body: some View {
VStack {
Button(action: {
self.isImagePickerDisplay.toggle()
}) {
Image(systemName: "plus")
.renderingMode(.original)
.font(.system(size: 16, weight: .medium))
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.background(Color(.white))
.clipShape(Circle())
.shadow(radius: 10)
}
.sheet(isPresented: self.$isImagePickerDisplay, onDismiss: { // << here !!
self.selected = selectedImage != nil
}) {
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
}
EmptyView()
.fullScreenCover(isPresented: $selected) {
EditView(selectedImage: $selectedImage)
}
}
}
}
struct-DFContentView:View{
@国家私有变量SelecteImage:UIImage?
@状态私有变量isImagePickerDisplay=false
@选择的状态私有变量:Bool=false
var body:一些观点{
VStack{
按钮(操作:{
self.isImagePickerDisplay.toggle()
}) {
图像(系统名称:“plus”)
.renderingMode(.original)
.font(.system(大小:16,重量:中等))
.aspectRatio(内容模式:.fit)
.框架(宽度:36,高度:36)
.背景(颜色(.白色))
.clipShape(圆())
.阴影(半径:10)
}
.sheet(显示:self.$isImagePickerDisplay,onDismiss:{//不清楚在哪里调用,请提供完整的正文,或者更好的整体视图。@Asperi哦,对不起。在这个问题上添加了整体视图。在此之前从未听说过ImagePickerView
。一年半前,我包装了一个UIImagePickerController
,当它工作时,我决定不在t使用SwiftUI
帽子时间(现在仍然不会).在网上搜索后,我发现这个图像采集器是第三方的。问题出在哪里?@did Hi!@Asperi解决了这个问题。事实上,这个第三方图像采集器视图对我来说非常有用。完整的屏幕覆盖和工作表不适用于XCode 12.2、iOS14.1两种解决方案-你的和@RajaKishan对我来说都有效,但我确实喜欢这个解决方案更多的是因为它更容易理解。所以我接受这个答案。但是我有一个问题-你认为使用EmptyView()是一个好的练习吗?
struct ContentView: View {
private enum SheetType {
case pickImage, showImage
}
@State private var selectedImage: UIImage?
@State private var selected: Bool = false
@State private var currentSheetType: SheetType = .pickImage
var body: some View {
Button(action: {
self.selected.toggle()
self.currentSheetType = .pickImage
}) {
Image(systemName: "plus")
.renderingMode(.original)
.font(.system(size: 16, weight: .medium))
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.background(Color(.white))
.clipShape(Circle())
.shadow(radius: 10)
}
.sheet(isPresented: self.$selected) {
if currentSheetType == .pickImage {
if selectedImage != nil {
self.selected.toggle()
self.currentSheetType = .showImage
}
}
} content: {
if currentSheetType == .pickImage {
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
} else if currentSheetType == .showImage {
EditView(selectedImage: $selectedImage)
}
}
}
}
struct DFContentView: View {
@State private var selectedImage: UIImage?
@State private var isImagePickerDisplay = false
@State private var selected: Bool = false
var body: some View {
VStack {
Button(action: {
self.isImagePickerDisplay.toggle()
}) {
Image(systemName: "plus")
.renderingMode(.original)
.font(.system(size: 16, weight: .medium))
.aspectRatio(contentMode: .fit)
.frame(width: 36, height: 36)
.background(Color(.white))
.clipShape(Circle())
.shadow(radius: 10)
}
.sheet(isPresented: self.$isImagePickerDisplay, onDismiss: { // << here !!
self.selected = selectedImage != nil
}) {
ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
}
EmptyView()
.fullScreenCover(isPresented: $selected) {
EditView(selectedImage: $selectedImage)
}
}
}
}