【发布时间】:2019-09-15 19:34:00
【问题描述】:
我正在构建一个 SwitUI 表单。我需要绘制一些自定义滑块。为此,我制作了一个视图 (SliderView),我在表单中多次包含该视图。我花了一些时间来管理绑定以在父视图中获取滑块的值,但我能够做到:-) 我无法理解的最大谜团是为什么我放置在子视图中的按钮在嵌入表单时不起作用。它们在 VStack 中工作正常。代码如下:
// SliderView.swift
import SwiftUI
struct SliderView: View {
var name: String
var min: Double
var max: Double
var step: Double
var defaultValue: Double
let numberFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2
formatter.minimumIntegerDigits = 1
return formatter
}()
@Binding var selectedValue: Double
var body: some View {
HStack{
Text("\(name)")
Slider(value: $selectedValue, in: self.min...self.max, step: self.step)
Button(action: {
if (self.selectedValue - self.step) >= self.min{
self.selectedValue = self.selectedValue - self.step
}
}) {
Image(systemName:"minus.circle")
}
Text("\(numberFormatter.string(from: NSNumber(value: selectedValue)) ?? "")")
.padding(5)
.onAppear {
self.selectedValue = self.defaultValue
}
Button(action: {
if (self.selectedValue + self.step) <= self.max{
self.selectedValue = self.selectedValue + self.step
}
}) {
Image(systemName:"plus.circle")
}
}
}
}
struct SliderView_Previews: PreviewProvider {
@State static var myValue: Double = 1
static var previews: some View {
SliderView(name: "CPU", min: 1, max: 10, step: 0.5, defaultValue: 1, selectedValue: $myValue)
}
}
现在,我正在构建的表单的一部分。代码编译,滑块工作,每个滑块的值都可以在父视图中看到。但是,逐步更新滑块的按钮不起作用(因为它们嵌入在表单中)
//
// ContentView.swift
import SwiftUI
struct ContentView: View {
@State var selectedCPU: Double = 1
@State var selectedRAM: Double = 1
@State var selectedDisk: Double = 50
var body: some View {
NavigationView{
Form{
Section{
SliderView(name: "CPU", min: 1, max: 16, step: 1, defaultValue: selectedCPU, selectedValue: $selectedCPU)
SliderView(name: "RAM", min: 0.5, max: 128, step: 0.5, defaultValue: selectedRAM, selectedValue: $selectedRAM)
SliderView(name: "SSD", min: 20, max: 500, step: 10, defaultValue: selectedDisk, selectedValue: $selectedDisk)
}
Section{
Text("CPU: \(selectedCPU)")
Text("RAM: \(selectedRAM)")
Text("SSD: \(selectedDisk)")
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
只需在上面的代码中用“VStack”替换“Form”,按钮就可以正常工作。任何人都可以解释一下吗?我认为是关于表单中不同层的东西。当我尝试单击按钮时,似乎单击了带有滑块的整行,但没有任何反应。 我在 MacOS 10.15 beta (19A558d) 中使用 Xcode 11 GM 提前致谢!
【问题讨论】:
-
在 Xcode 11.1 和 MacOS 10.15 中发生同样的情况
标签: swiftui