我正在构建一个 SwitUI 表单。我需要绘制一些自定义滑块。为此,我创建了一个视图 (SliderView),并将其多次包含在表单中。我花了一些时间来管理 Binding 以在父视图中获取 Sliders 的值,但我能够做到 :-) 我无法理解的最大谜团是为什么我放置在孩子中的按钮视图,当它们嵌入到表单中时不起作用。它们在 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) >= …Run Code Online (Sandbox Code Playgroud) 我正在玩SwitUI,试图了解ObservableObject的工作原理。我有一个Person对象数组。当我将新的Person添加到数组中时,它将重新加载到我的View中。但是,如果我更改现有Person的值,则不会在视图中重新加载它
// NamesClass.swift
import Foundation
import SwiftUI
import Combine
class Person: ObservableObject,Identifiable{
var id: Int
@Published var name: String
init(id: Int, name: String){
self.id = id
self.name = name
}
}
class People: ObservableObject{
@Published var people: [Person]
init(){
self.people = [
Person(id: 1, name:"Javier"),
Person(id: 2, name:"Juan"),
Person(id: 3, name:"Pedro"),
Person(id: 4, name:"Luis")]
}
}
Run Code Online (Sandbox Code Playgroud)
struct ContentView: View {
@ObservedObject var mypeople: People
var body: some View {
VStack{
ForEach(mypeople.people){ person in
Text("\(person.name)")
}
Button(action: {
self.mypeople.people[0].name="Jaime"
//self.mypeople.people.append(Person(id: 5, …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Rest API 获取数据中心列表并将它们显示在选择器中,以便用户可以选择一个。当我用静态列表做它时,它工作正常。但是,动态检索数据中心似乎效果不佳。
我正在使用 Xcode 11 (GM)
这是数据中心对象
struct Datacenter:Codable, Hashable, Identifiable{
let id: String
var location: String
}
Run Code Online (Sandbox Code Playgroud)
这是 ObservedObject(它的属性 datacenters 是一个 Datacenter 对象数组)
@ObservedObject var datacenters_controller : DatacentersController
@State private var selectedDatacenter = 0
Run Code Online (Sandbox Code Playgroud)
这是我的第一次尝试:
Picker(selection: $selectedDatacenter, label: Text("Datacenter")) {
ForEach(0 ..< datacenters_controller.datacenters.count) {
Text(self.datacenters_controller.datacenters[$0].location)
}
}
Run Code Online (Sandbox Code Playgroud)
Swift 抱怨以下错误:
ForEach<Range<Int>, Int, Text> count (4) != its initial count (0). `ForEach(_:content:)` should only be used for *constant* data. Instead conform data to `Identifiable` or use `ForEach(_:id:content:)` and provide …Run Code Online (Sandbox Code Playgroud) swiftui ×3