如何在 swiftUI 中选择项目时在选择器上添加操作?
Posted
技术标签:
【中文标题】如何在 swiftUI 中选择项目时在选择器上添加操作?【英文标题】:How do I add action on picker on selection of item in swiftUI? 【发布时间】:2020-03-02 14:31:49 【问题描述】:我有一个带有某些项目列表(比如添加、编辑、删除)的选择器,在选择特定项目时,我需要移动到不同的屏幕。我试过 onTapGuesture() 但是当我调试它时控制不会进入内部。
【问题讨论】:
onChange 函数应该可以工作,然后发送一个被选中的标识符并更新一个状态以移动到新视图 【参考方案1】:我找到了 3 种不同的方法来实现这一目标。我拍的最后一张here。所以,有这些方法,你可以选择你想要的:
struct PickerOnChange: View
private var options = ["add", "edit", "delete"]
@State private var selectedOption = 0
@State private var choosed = 0
var body: some View
VStack
Picker(selection: $selectedOption.onChange(changeViewWithThirdWay), label: Text("Choose action"))
ForEach(0 ..< self.options.count)
Text(self.options[$0]).tag($0)
.pickerStyle(SegmentedPickerStyle())
// MARK: first way
VStack
if selectedOption == 0
Text("add (first way)")
else if selectedOption == 1
Text("edit (first way)")
else
Text("delete (first way)")
Divider()
// MARK: second way
ZStack
AddView()
.opacity(selectedOption == 0 ? 1 : 0)
EditView()
.opacity(selectedOption == 1 ? 1 : 0)
DeleteView()
.opacity(selectedOption == 2 ? 1 : 0)
Divider()
// MARK: showing third way
Text("just to show, how to use third way: \(self.choosed)")
Spacer()
func changeViewWithThirdWay(_ newValue: Int)
print("will change something in third way with: \(choosed), you can do everything in this function")
withAnimation
choosed = newValue
// MARK: the third way
extension Binding
func onChange(_ handler: @escaping (Value) -> Void) -> Binding<Value>
return Binding(
get: self.wrappedValue ,
set: selection in
self.wrappedValue = selection
handler(selection)
)
您将使用代码 sn-p 实现此目的:
【讨论】:
var options = ["General", "About"] @State private var selectedOption = 0 如果我需要从模型类中读取数据并设置默认选中项,我应该使用@Binding 吗? @RamyaSharma 你是什么意思? 如果我的选项数组来自模型类,我应该使用@ObservedObject 吗?另外,在这种情况下如何设置默认状态? 我收到错误 -> 无法在属性初始化程序中使用实例成员“ModelClass”;如果我尝试设置 @State var selected = ModelClass.options[0],则属性初始化程序在“self”可用之前运行 @RamyaSharma 我认为最好用您的代码 sn-p 和错误消息提出另一个问题。我现在还不太清楚,你想实现什么以及你想如何处理你的数据以上是关于如何在 swiftUI 中选择项目时在选择器上添加操作?的主要内容,如果未能解决你的问题,请参考以下文章