【问题标题】:SwiftUI app work in preview but not in simulatorSwiftUI 应用程序在预览中工作,但不在模拟器中
【发布时间】:2019-12-20 11:21:44
【问题描述】:

我正在为一个学校项目制作一个应用程序,我试图计算一个人在不同星球上的重量。 ContentView 文件在预览中工作正常,但仅在模拟器/iPhone 中显示 NavigationBar.title。这是代码

import SwiftUI

struct ContentView : View {
    var planets: [Planet] = []
    var body: some View {
        NavigationView {

            List(planets) { planet in
                PlanetCell(planet: planet)
            }
            .navigationBarTitle(Text("Sun"))

        }
    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView(planets: testData)
    }
}
#endif

struct PlanetCell : View {
    let planet : Planet
    var body: some View {
        return NavigationLink(destination: PlanetDetail(planet: planet)){
            Text(planet.name)
        }
    }
}

编辑名为 Planet 的 swift 文件

import Foundation
import SwiftUI
struct Planet : Identifiable {
    var id = UUID()
    var name: String
    var g : Float
    var imageName : String { return name }
}

#if DEBUG
let testData = [

    Planet(name: "Mercury", g: 3.724),
    Planet(name: "Venus", g: 8.918),
    Planet(name: "Earth", g: 9.8),
    Planet(name: "Mars", g: 3.724),
    Planet(name: "Jupiter", g: 22.932),
    Planet(name: "Saturn", g: 9.114),
    Planet(name: "Uranus", g: 9.016),
    Planet(name: "Neptune", g: 10.976)

]

#endif


【问题讨论】:

  • 您是否看到一个空的 SwiftUI 列表(表格视图)?或者根本没有表格视图?能发个模拟器截图吗?
  • 正如我所料,您的代码正常并显示 UI,但您的 Data 数组为空,这就是它不填充任何数据的原因。您的行星阵列中有 0 个行星
  • 我制作了一个名为 Planet 的结构,其中包含数据(显示在预览中)。你能告诉我如何解决这个问题吗?
  • 您的示例数据被包裹在 #if DEBUG 闭包中,因此它只能在预览中使用

标签: ios swiftui swiftui-list


【解决方案1】:

实际上,您的代码很好,可以按预期进行,您的 testData 仅在调试模式下可用(预览版)。这就是为什么您在真实设备或模拟器中看不到它的原因,为了查看实际数据,您需要在 ContentView 文件中填充数据数组 planets,因此它应该像您的 @ 一样在其中包含一些行星987654325@。你应该修改你的ContentView如下:

import SwiftUI

struct ContentView : View {
    var planets: [Planet] = [

        Planet(name: "Mercury", g: 3.724),
        Planet(name: "Venus", g: 8.918),
        Planet(name: "Earth", g: 9.8),
        Planet(name: "Mars", g: 3.724),
        Planet(name: "Jupiter", g: 22.932),
        Planet(name: "Saturn", g: 9.114),
        Planet(name: "Uranus", g: 9.016),
        Planet(name: "Neptune", g: 10.976)

    ]
    var body: some View {
        NavigationView {

            List(planets) { planet in
                PlanetCell(planet: planet)
            }
            .navigationBarTitle(Text("Sun"))

        }
    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView(planets: testData)
    }
}
#endif

struct PlanetCell : View {
    let planet : Planet
    var body: some View {
        return NavigationLink(destination: PlanetDetail(planet: planet)){
            Text(planet.name)
        }
    }
}

我建议您看看如何使用 ObservableObject 和 State 将 UI 与您的模型更改绑定,您可以查看本教程:SwiftUI by Example

【讨论】:

  • 多年后...超级有帮助!谢谢!
【解决方案2】:

在 ContentView 中更改

var planets: [Planet] = []

到

var planets: [Planet] = testData

【讨论】:

    【解决方案3】:

    初始化时是否将非空列表 (planets) 传递给 ContentView?

    【讨论】:

    • 我不确定这是否是您的意思ContentView(planets: testData),如果是,那么我在上面的代码中。如果没有,你能告诉我怎么做吗,因为我对 iOS 编程还很陌生。
    • ContentView_Previews 中的代码用于 Xcode 预览。这就是你的 Xcode Preview 工作的原因。但是,对于模拟器(或设备),不使用此代码。你能告诉我们你在哪里使用你的ContentView 对象吗?在SceneDelegate 也许?
    • 等等,我不知道我们必须使用ContentView 对象。我从几个教程中学习了 swiftUI,它们都可以工作,而无需在 SceneDelegate 中编写代码。我制作了一个文件,单击单元格时要在其中显示数据。抱歉,如果这个问题很愚蠢-我如何制作ContentView 对象。
    • 我鼓励您关注 Apple 教程。请参阅Building Lists and Navigation,它应该适合您的需求。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多