当用户从照片库中选择图像时如何显示另一个视图

Posted

技术标签:

【中文标题】当用户从照片库中选择图像时如何显示另一个视图【英文标题】:How to show another view when user selects image from the photo library 【发布时间】:2021-01-09 15:03:18 【问题描述】:

我的问题是我无法在另一个视图中显示所选图像,因为我无法将变量 selected 设置为 true。

我的变量:

@State private var selectedImage: UIImage?
@State private var isImagePickerDisplay = false
@State private var selected: Bool = false

第 1 步 - 我为用户展示 ImagePicker(工作正常):

.sheet(isPresented: self.$isImagePickerDisplay) 
        ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)

第 2 步 - 我找不到知道用户何时实际选择图像的正确方法。我试着这样做:

if selectedImage != nil 
        selected = true

但我得到错误:

类型'()'不能符合'View';只有结构/枚举/类类型可以符合协议

第 3 步 - 如果用户实际从照片库中选择图像,我的计划是显示另一个视图:

.fullScreenCover(isPresented: $selected) 
        EditView(selectedImage: $selectedImage)

请记住,我是 SwiftUI 的新手。我刚刚完成教程,现在我正在尝试自己开发一个项目。

编辑(添加了我的整个 ContentView()):

struct ContentView: View 
    @State private var selectedImage: UIImage?
    @State private var isImagePickerDisplay = false
    @State private var selected: Bool = false
    
    var body: some View 
        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) 
            ImagePickerView(selectedImage: self.$selectedImage, sourceType: .photoLibrary)
        
        
        if selectedImage != nil 
            selected = true
        
        
        .fullScreenCover(isPresented: $selected) 
            EditView(selectedImage: $selectedImage)
        
    

【问题讨论】:

不清楚在哪里叫什么,请提供完整的正文,或者更好的整体视图。 @Asperi 哦,对不起。为问题添加了整个视图。 在此之前从未听说过ImagePickerView。一年半前我包装了一个UIImagePickerController,虽然它起作用了,但我当时决定不使用SwiftUI(现在仍然不会)。在网上搜索后,我看到这个图像选择器是第三方的。有没有可能是问题所在? @did 你好! @Asperi 解决了这个问题。实际上,这个第 3 方 ImagePickerView 非常适合我。 【参考方案1】:

也许你想要这个

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)
                
        
    

更新:感谢@RajaKishan,关于 ios 14.2 - 更新了分开的 .sheet.fullScreenCover 到不同的视图。经过测试和工作。

【讨论】:

fullScreenCover 和 sheet 不能与 XCode 12.2、iOS14.1 一起使用 两种解决方案——你的和@RajaKishan 都适合我,但我更喜欢这个解决方案,因为它更容易理解。所以我会接受这个答案。但我有一个问题 - 你认为使用 EmptyView() 是一种好习惯吗?【参考方案2】:

可能的解决方案

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)
            
        
    

【讨论】:

以上是关于当用户从照片库中选择图像时如何显示另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ImageView 中显示图库中的图像?

如何在 CollectionView 中显示从照片库或相机中选择的图像?画廊视图

如何在用户配置文件视图控制器上显示从火存储到 UIImageView 的图像?

如何从 UIImagePickerController 将图像导入新的 VC?迅速

如何在ios中删除照片的图像?

从 UICollectionView 中删除一个项目