繁体   English   中英

SwiftUI Picker 不会在 MacOS 上选择结构

[英]SwiftUI Picker doesn't select struct on MacOS

我在视图中有一个Picker

       Form {
            Section {
                Picker("Style instance:", selection: $global.selectedStyle) {
                    ForEach(global.axes.instances.indices, id:\.self) { index in
                        return HStack {
                            let instance = global.axes.instances[index]
                            Text("\(instance.name)")//.tag(index)
                            Spacer()
                            Text(" \(instance.coordinates.description)")
                        }
                    }
                }
                .pickerStyle(PopUpButtonPickerStyle())
            }
        }

global被定义为一个@ObservedObject ,内部:

@Published public var selectedStyle: StyleInstance? {
    didSet {
        print ("Changed \(selectedStyle?.description ?? "Nothing selected")")
        if let selected = selectedStyle {
            for index in axes.indices {
                axes[index].at =  Double(selected.coordinates[index])
            }
        }
    }
}

StyleInstance是一个简单的结构:

public struct StyleInstance: Hashable, Codable {
    
    public static var emptyName = "<normal>" //this string will be replaced by empty string
    public let name: String
    public let coordinates: [Int]

    // init removes word `<normal>` and spaces
    init(name: String, coordinates:[CoordUnit]) {
        self.name = name.split(separator: " ").filter({$0 != StyleInstance.emptyName}).joined(separator: " ")
        self.coordinates = coordinates.map {Int($0)}
    }
}

当我在 Picker 中更改选择时, selectedInstance .. {didSet..被触发,但它始终nil

您需要将.tag修饰符应用于ForEach内的HStack 由于您的选择绑定是Optional<StyleInstance> ,您还需要强制标记值是可选的:

ForEach(global.axes.instances.indices, id:\.self) { index in
    return HStack {
        let instance = global.axes.instances[index]
        Text("\(instance.name)")//.tag(index)
        Spacer()
        Text(" \(instance.coordinates.description)")
    }.tag(global.axes.instances[index] as Optional)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM