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)
                }
        }
    }
}