swift 如何创建一个可以显示多个对象的视图?

3vpjnl9f  于 2023-11-16  发布在  Swift
关注(0)|答案(1)|浏览(163)

我有一个看起来像这样的视图:

struct CardView: View {
    let item: Items

    var body: some View {
        VStack(alignment: .center) {
            Text("\(item.name)")
                .font(.headline)
                .accessibilityAddTraits(.isHeader)
            Spacer()
            HStack {
                Label("\(item.description)", systemImage: "questionmark.square.dashed")
            }
            .font(.caption)
        }
        .padding()
    }
}

struct CardView_Previews: PreviewProvider {
    static var item = Items.abilityScores[0]
    static var previews: some View {
        CardView(item: item)
            .previewLayout(.fixed(width: 400, height: 60))
    }
}

字符串
Items.abilityScores是我在类文件中生成的Items列表。如果需要,我可以向您展示。)
我想为不同类型的几个不同对象重用此视图。
有几种可能的方式,我可以看到这一点:
1.我为Item创建了一个基类,然后把它传递给一堆其他的类,这些类有更多的属性/变量/其他什么。我怀疑我能做到这一点。
1.我单独创建每个类,即使它们在实现/使用方面都非常相似,并为每个类创建一个单独的视图。
1.还有别的事吗也许使参数AnyObject和给予他们都是相同的字段名称,然后做一些喜欢,检查是否有价值的东西,然后再试图显示他们?

1是可能的吗?或者我屈服于#2,为不同的对象一遍又一遍地创建相同的视图?

rta7y2nd

rta7y2nd1#

这个怎么样?

protocol ItemProtocol {
    func name() -> String
    func description() -> String
    func optionalThing() -> String?
}

struct Item1: ItemProtocol {
    var n: String
    var d: String
    var t: String
    func name() -> String {
        n
    }
    func description() -> String {
        d
    }
    func optionalThing() -> String? {
        t
    }
}

struct Item2: ItemProtocol {
    var n: String
    var d: String
    func name() -> String {
        n
    }
    func description() -> String {
        d
    }
    func optionalThing() -> String? {
        nil
    }
}

struct CardView: View {
    let item: ItemProtocol

    var body: some View {
        VStack(alignment: .center) {
            Text("\(item.name())")
                .font(.headline)
                .accessibilityAddTraits(.isHeader)
            Spacer()
            HStack {
                Label("\(item.description())", systemImage: "questionmark.square.dashed")
                if let optionalThing = item.optionalThing() {
                    Label("\(optionalThing)", systemImage: "questionmark.square.dashed")
                }
            }
            .font(.caption)
        }
        .padding()
    }
}

字符串
有:

let viewController = NSHostingController(rootView: CardView(item: Item1(n: "Name1", d: "Description1", t: "Optional Thing")))


的数据
有:

let viewController = NSHostingController(rootView: CardView(item: Item2(n: "Name2", d: "Description2")))


相关问题