如何解决为每个操作表按钮添加不同的修饰符
这可能是一个很简单的问题,但我找不到答案。
我正在尝试构建一个带有两个按钮(以及一个取消按钮)的 ActionSheet:
- 按钮“从图库中选择”打开一个
imagePicker
,其中sourceType
设置为.photoLibrary
。 - “拍摄新照片”按钮会打开一个
imagePicker
,其中sourceType
设置为.camera
。
我已经成功地制作了 ActionSheet 和 imagePicker,但无法确定在哪里添加修饰符来告诉每个按钮应该使用哪个 sourceType。我设法将它添加到 ActionSheet 之外的 sheet()
修饰符中的一个普通按钮中,并且一切正常:
Button(action: {
self.show.toggle()
})
{Text("Take a new picture")}
.sheet(isPresented: self.$show,content: {
ImagePicker(sourceType: .camera,show: self.$show,image: self.$imageTemp)
})
但是,我看不到在 ActionSheet 中的何处包含此信息。非常感谢任何可以提供帮助的人,我希望这很清楚:-)
这是我的代码:
struct ContentView: View {
@State private var showingActionSheet = false
@State var imageTemp : Data = (UIImage(systemName: "photo.on.rectangle.angled")?.jpegData(compressionQuality: 1))!
var body: some View {
NavigationView {
Image(uiImage: UIImage(data: imageTemp)!)
.onTapGesture {
self.showingActionSheet = true
}
.actionSheet(isPresented: $showingActionSheet) {
ActionSheet(title: Text("Image selector"),message: Text("Select an image"),buttons: [
.default(Text("Select from Gallery"))
{
self.show.toggle()
},.default(Text("Take new picture")) {
self.show.toggle()
},.cancel()
]
)
}
}
}
}
而且,为了以防万一,这里是我的 imagePicker 的代码,尽管我认为它可能没有必要。
struct ImagePicker: UIViewControllerRepresentable {
var sourceType: UIImagePickerController.SourceType = .photoLibrary
@Binding var show: Bool
@Binding var image: Data
func makeCoordinator() -> ImagePicker.Coordinator {
let imagePicker = UIImagePickerController()
return ImagePicker.Coordinator(child1: self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
picker.sourceType = sourceType
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController,context: UIViewControllerRepresentableContext<ImagePicker>) {
}
class Coordinator: NSObject,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
var child : ImagePicker
init(child1: ImagePicker) {
child = child1
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.child.show.toggle()
}
func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
let image = info[.originalImage]as! UIImage
let data = image.jpegData(compressionQuality: 0.45)
self.child.image = data!
self.child.show.toggle()
}
}
}
解决方法
您的问题基本上可以归结为“我如何展示多张工作表?”,因此 this thread 可能会有所帮助。
- 定义新的
enum
以包含可能的工作表类型(画廊/拍照) - 声明一个
@State
属性来保存当前的工作表类型。它是可选的,因为当它为零时,将不显示工作表。 - 将属性设置为您想要的类型
- 使用
sheet(item:onDismiss:content:)
而不是sheet(isPresented:onDismiss:content:)
。isPresented
最适合静态工作表。item
适用于您需要的多种工作表类型。
enum PhotoSheetType: Identifiable { /// 1.
var id: UUID {
UUID()
}
case gallery
case picture
}
struct ContentView: View {
/// 2.
@State private var showingType: PhotoSheetType?
@State private var showingActionSheet = false
@State var imageTemp : Data = (UIImage(systemName: "photo.on.rectangle.angled")?.jpegData(compressionQuality: 1))!
var body: some View {
NavigationView {
Image(uiImage: UIImage(data: imageTemp)!)
.onTapGesture {
self.showingActionSheet = true
}
.actionSheet(isPresented: $showingActionSheet) {
ActionSheet(
title: Text("Image selector"),message: Text("Select an image"),buttons: [
.default(Text("Select from Gallery")) {
showingType = .gallery /// 3.
},.default(Text("Take new picture")) {
showingType = .picture /// 3.
},.cancel()
]
)
} /// 4.
.sheet(item: $showingType) { type in
if type == .gallery {
ImagePicker(sourceType: .photoLibrary,showingType: $showingType,image: self.$imageTemp)
} else {
ImagePicker(sourceType: .camera,image: self.$imageTemp)
}
}
}
}
}
您还需要修改您的 ImagePicker
,以便 Binding
接受 PhotoSheetType?
而不是 Bool
。要关闭工作表,只需将 showingType
设置为 nil。
struct ImagePicker: UIViewControllerRepresentable {
var sourceType: UIImagePickerController.SourceType = .photoLibrary
@Binding var showingType: PhotoSheetType?
@Binding var image: Data
func makeCoordinator() -> ImagePicker.Coordinator {
let imagePicker = UIImagePickerController()
return ImagePicker.Coordinator(child1: self)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.delegate = context.coordinator
picker.sourceType = sourceType
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController,context: UIViewControllerRepresentableContext<ImagePicker>) {
}
class Coordinator: NSObject,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
var child : ImagePicker
init(child1: ImagePicker) {
child = child1
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.child.showingType = nil /// set to nil here
}
func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
let image = info[.originalImage] as! UIImage
let data = image.jpegData(compressionQuality: 0.45)
self.child.image = data!
self.child.showingType = nil /// set to nil here
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。