【问题标题】: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 非常适合我。

标签: swiftui


【解决方案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)
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-11-16
    • 2014-02-03
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    相关资源
    最近更新 更多