SwiftUI - 选择器
Posted
技术标签:
【中文标题】SwiftUI - 选择器【英文标题】:SwiftUI - Picker 【发布时间】:2020-07-18 07:56:11 【问题描述】:我正在快速学习,现在我已经插入了 2 个调用结构 Animal 的选择器。 我无法理解的是如何告诉 swift 如果第一个选择器选择了一个枚举值,那么第二个选择器可用的枚举中不能存在相同的值,因为它已经被选择了。
非常感谢:)
import SwiftUI
enum Animal: String, CaseIterable
case selectCase = "Select"
case bear = "Bear"
case cat = "Cat"
case dog = "Dog"
case lion = "Lion"
case tiger = "Tiger"
static var animals: [String] = [selectCase.rawValue, bear.rawValue, cat.rawValue, dog.rawValue, lion.rawValue, tiger.rawValue]
struct ContentView: View
@State private var Picker1: String = Animal.animals[0]
@State private var Picker2: String = Animal.animals[0]
var body: some View
NavigationView
Form
Section(header: Text("Animals")
.foregroundColor(.black)
.font(.system(size: 15))
.fontWeight(.bold))
Picker(selection: $Picker1, label: Text("Select first animal"))
ForEach(Animal.animals, id: \.self) element in
Text(element)
Picker(selection: $Picker2, label: Text("Select second animal"))
ForEach(Animal.animals, id: \.self) element2 in
Text(element2)
.font(.system(size: 15))
.navigationBarTitle("List", displayMode: .inline)
struct ContentView_Previews: PreviewProvider
static var previews: some View
ContentView()
【问题讨论】:
【参考方案1】:使用filter
从第一个Picker
中过滤掉选定的元素,除非选定的案例是selectCase
。还为您做了一些改进。
-
由于枚举已经符合
CaseIterable
协议,您不必创建自定义animals
数组。
此外,您可以在 rawValue 上使用大写字母,而不是为每个感觉多余的枚举案例提供 rawValue。
属性名称应以小写字母开头并命名为Picker1
以免混淆,将所选动物命名为firstAnimal
或selectedFirstAnimal
将来会更方便。
这是代码。
enum Animal: String, CaseIterable
case select
case bear
case cat
case dog
case lion
case tiger
struct ContentView: View
@State private var firstAnimal = Animal.allCases[0]
@State private var secondAnimal = Animal.allCases[0]
var body: some View
NavigationView
Form
Section(header: Text("Animals")
.foregroundColor(.black)
.font(.system(size: 15))
.fontWeight(.bold))
Picker(selection: $firstAnimal, label: Text("Select first animal"))
ForEach(Animal.allCases, id: \.self) element in
Text(element.rawValue.capitalized)
Picker(selection: $secondAnimal, label: Text("Select second animal"))
ForEach(Animal.allCases.filter $0 != firstAnimal || firstAnimal == .select , id: \.self) element2 in
Text(element2.rawValue.capitalized)
.font(.system(size: 15))
.navigationBarTitle("List", displayMode: .inline)
【讨论】:
哇。我真的非常感谢你,你解决了我的问题。 :) 祝你有美好的一天再次感谢以上是关于SwiftUI - 选择器的主要内容,如果未能解决你的问题,请参考以下文章