我正在使用SwiftUI,并且想要在切换状态更改时做一些事情,但是我找不到解决方案。
当切换状态更改时,如何调用函数或做什么?
@State var condition = false
Toggle(isOn: $condition) {
Text("Toggle text here")
}
答案 0 :(得分:1)
您可以像下面的第一个示例一样使用 .onChange
修饰符。
但是,请记住,在大多数情况下我们不需要它。
如果是视图设置,则绑定到 @State bool 值,然后使用此 bool 修改视图层次结构,如第一个示例所示。
如果您的模型发生变化,您可以将开关绑定到模型或模型控制器中的 @Published 值。在这种情况下,模型或模型控制器从开关接收更改,执行任何请求,然后重新渲染视图。它必须具有对您的模型的 @ObservedObject 引用。
我在第一个示例中展示了如何使用 .onChange
修饰符。它只是记录状态。
请记住,SwiftUI 视图中的逻辑应尽可能少。 顺便说一句,在 SwiftUI 发明之前,这已经是真的了 ;)
示例 1 - @State 值。 (本地界面设置)
import SwiftUI
struct ToggleDetailView: View {
@State var isDetailVisible: Bool = true
var body: some View {
VStack {
Toggle("Display Detail", isOn: $isDetailVisible)
.onChange(of: self.isDetailVisible, perform: { value in
print("Value has changed : \(value)")
})
if isDetailVisible {
Text("Detail is visible!")
}
}
.padding(10)
.frame(width: 300, height: 150, alignment: .top)
}
}
struct ToggleDetailView_Previews: PreviewProvider {
static var previews: some View {
ToggleDetailView()
}
}
示例 2 - @ObservedObject 值。 (对模型的操作)
import SwiftUI
class MyModel: ObservableObject {
@Published var isSolid: Bool = false
var string: String {
isSolid ? "This is solid" : "This is fragile"
}
}
struct ToggleModelView: View {
@ObservedObject var model: MyModel
var body: some View {
VStack {
Toggle("Solid Model", isOn: $model.isSolid)
Text(model.string)
}
.padding(10)
.frame(width: 300, height: 150, alignment: .top)
}
}
struct ToggleModelView_Previews: PreviewProvider {
static var previews: some View {
ToggleModelView(model: MyModel())
}
}
答案 1 :(得分:0)
尝试
struct ContentView: View {
@State var condition = false
var body: some View {
if condition {
callMe()
}
else {
print("off")
}
return Toggle(isOn: $condition) {
Text("Toggle text here")
}
}
func callMe() {
}
}
答案 2 :(得分:0)
凯伦,请检查
0.0011711121
添加这样的功能
@State var isChecked: Bool = true
@State var index: Int = 0
Toggle(isOn: self.$isChecked) {
Text("This is a Switch")
if (self.isChecked) {
Text("\(self.toggleAction(state: "Checked", index: index))")
} else {
CustomAlertView()
Text("\(self.toggleAction(state: "Unchecked", index: index))")
}
}
答案 3 :(得分:0)
如果要在切换状态更改时执行某些操作,则可以使用didSet。
struct ContentView: View {
@State var condition = false{
didSet{
print("condition changed to \(condition)")
}
}
var body: some View {
let bind = Binding<Bool>(
get:{self.condition},
set:{self.condition = $0}
)
return Toggle(isOn: bind){
Text("Toggle text here")
}
}
}
当我们说@State var condition = true
时,它的类型是State<Bool>
而不是Bool
。
当我们在切换中使用绑定(在这种情况下为$condition
时),切换直接更改了存储的值。这意味着它永远不会更改@State,所以didSet将永远不会被触发。
因此,在这里,我们创建let bind
结构的实例并将其分配给Binding<Value>
,并在切换中直接使用该Binding结构。比当我们设置self.condition = $0
时,它将触发didSet。
答案 4 :(得分:0)
我倾向于使用:
Toggle(isOn: $condition, label: {
Text("Power: \(condition ? "On" : "Off")")
})
.padding(.horizontal, 10.0)
.frame(width: 225, height: 50, alignment: .center)