【问题标题】:SwiftUI List doesn't show Text viewsSwiftUI 列表不显示文本视图
【发布时间】:2021-11-20 03:00:28
【问题描述】:

玩转 SwiftUI 的列表视图。似乎无法获得一个简单的列表来显示一些文本条目。

这是我的 SwiftUI 视图:

struct DeviceView: View {
  
  var body: some View {
    List {
      Text("First").foregroundColor(Color.red)
      Text("Second")
      Text("Third")
      Text("Fourth")
      Text("Fifth")
      Text("Sixth")
      Text("Seventh")
      Text("Eighth")
      Text("Ninth")
      Text("Tenth")
    }.font(.largeTitle)
  }
}

我正在 UIKit 视图控制器中创建视图,如下所示:

class ViewController: UIViewController {
  
  override func viewDidLoad() {
    super.viewDidLoad()
        
    let swiftUIController = UIHostingController(rootView: DeviceView())

    addChild(swiftUIController)
    swiftUIController.view.translatesAutoresizingMaskIntoConstraints = false

    view.addSubview(swiftUIController.view)

    swiftUIController.view.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    swiftUIController.view.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

    swiftUIController.didMove(toParent: self)
  }
}

如果我将 List 注释掉,则显示 Text 项。

为什么列表不显示文本视图?

【问题讨论】:

  • 这不是您在 SwiftUI 中制作列表的方式。将ForEach 与字符串数组一起使用,或者至少在那里使用VStack
  • 为什么使用ViewController 包装器——为什么不使用UIHostingController(rootView: DeviceView())
  • 对不起...不要跟随。 UIHostingController(rootView: DeviceView()) 正是我上面所说的。你能解释一下吗?
  • @Phantom59 在某些时候,您在某处有这行代码:ViewController()。我试图弄清楚为什么你不只是用UIHostingController(rootView: DeviceView()) 替换它。 ViewController 包装器有什么用?
  • 我想我可以......一直回到我的场景委托。我创建了一个小示例项目来研究这个,它是一个更大的应用程序的一部分。这是 Xcode 创建默认项目的方式。无论如何,我认为这与我最初的问题没有任何关系。

标签: list swiftui


【解决方案1】:

这是一个使用 Playground 的可能解决方案。正如上面有人评论的那样,您需要将您的 SwiftUI View 放在 UIHostingController 的根视图中。

import UIKit
import PlaygroundSupport
import SwiftUI

struct ContentView: View {
    var body: some View {
        List{
            ForEach(1..<11) { value in
                Text(spellout(NSNumber(value: value)).capitalized)
            }
        }
    }
    
    func spellout(_ value: NSNumber) -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .spellOut
        return formatter.string(from: value)!
    }
}

let viewController = UIHostingController(rootView: ContentView())
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = viewController

【讨论】:

  • 谢谢,但这仅适用于您可以迭代的东西,而我的情况并非如此。为了简单起见,我使用了第一个到第十个。但在我的现实中,我有自定义视图。
  • 您不必迭代它们。使用自定义视图。它主要是底部视图控制器部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2014-11-21
  • 2013-02-17
  • 2023-03-28
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多