【发布时间】:2021-02-14 20:19:55
【问题描述】:
我在游乐场工作,试图学习 SwiftUI。我正在创建一个视图,其中包含一个标签、一个文本字段、用于显示选取器和选取器值的文本。
我目前拥有的是这个
import UIKit
import PlaygroundSupport
import SwiftUI
enum Units: String, CaseIterable, Identifiable
{
case Inches = "in"
case Millimeters = "mm"
case Centimeters = "cm"
var id: String { self.rawValue }
}
struct VariableView: View
{
let name: String
let labelValue: String
@State private var inputValue = ""
@State private var inputUnits = Units.Inches
init(name: String, label: String)
{
self.name = name
labelValue = label
}
var body: some View
{
VStack(alignment: .leading, spacing: 0)
{
Text(self.labelValue)
.font(.subheadline)
.frame(width: .infinity, alignment: .leading)
.padding(.horizontal, 4)
HStack
{
TextField("Value", text: $inputValue)
.padding(.horizontal, 4)
.keyboardType(.numbersAndPunctuation)
Text(inputUnits.id)
Picker("...", selection: $inputUnits)
{
/*
Text("Inches").tag(Units.Inches)
Text("Millimeters").tag(Units.Millimeters)
Text("Centimeters").tag(Units.Centimeters)
*/
ForEach(Units.allCases)
{
unit in Text(unit.rawValue.capitalized)
}
}
.padding(10)
.pickerStyle(MenuPickerStyle())
}
Divider()
.frame(height: 1)
.padding(.horizontal, 30)
.background(Color.black)
}
}
}
// Make a SwiftUI view
struct ContentView: View
{
var body: some View
{
VariableView(name: "value1", label: "Value 1")
VariableView(name: "value1", label: "Value 2")
VariableView(name: "value1", label: "Value 3")
VariableView(name: "value1", label: "Value 4")
VariableView(name: "value1", label: "Value 5")
}
}
// Make a UIHostingController
let viewController = UIHostingController(rootView: ContentView())
// Assign it to the playground's liveView
PlaygroundPage.current.liveView = viewController
当我单击“...”时,它会崩溃。变为黑色并停止运行。没有错误,只是停止。
如果我使用三个文本行(当前已注释掉)而不是 ForEach,它可以工作 - 但最终我需要能够为每个输入动态设置允许的单位,所以我需要 ForEach 工作。
【问题讨论】:
-
这看起来像是 Playground 限制(可能是选择器菜单样式)。此代码在模拟器中运行良好。
-
尝试模拟器或真实设备 - 在这里可以正常工作。我认为这是 Playground 的错误。
-
谢谢大家。我以为我快疯了。可以在模拟器中运行游乐场吗?
-
@jbmillard 的答案有用吗?