因此,我尝试在SwiftUI视图中调试时放入一条打印语句。
print("landmark: \(landmark)")
Run Code Online (Sandbox Code Playgroud)
在下面的身体。
var body: some View {
NavigationView {
List {
Toggle(isOn: $userData.showFavoritesOnly) {
Text("Favorite only")
}
ForEach(landmarkData) { landmark in
print("landmark: \(landmark)")
if !self.userData.showFavoritesOnly || landmark.isFavorite {
NavigationButton(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
}
}.navigationBarTitle(Text("Landmarks"))
}
}
Run Code Online (Sandbox Code Playgroud)
那么,在SwiftUI中打印到控制台的正确方法是什么?
编辑:我使Landmark符合CustomStringConvertible:
struct Landmark: Hashable, Codable, Identifiable, CustomStringConvertible {
var description: String { name+"\(id)" }
var id: Int
var name: String
.....
Run Code Online (Sandbox Code Playgroud)
我仍然收到“字符串不可转换为任何字符串”的错误。现在应该工作吗?
jul*_*665 87
至少在 Xcode 12/Swift 5.3 中,您可以轻松地在函数构建器的任何位置添加打印语句,只需将其返回值存储在通配符中,有效地忽略它:
let _ = print("hi!")
Run Code Online (Sandbox Code Playgroud)
无需设置或其他详细信息!
Rok*_*lec 48
这是一个辅助Print( ... )视图,它的作用类似于print( ... )函数,但位于视图中
把它放在你的任何视图文件中
extension View {
func Print(_ vars: Any...) -> some View {
for v in vars { print(v) }
return EmptyView()
}
}
Run Code Online (Sandbox Code Playgroud)
并body像这样在里面使用
Print("Here I am", varOne, varTwo ...)
Run Code Online (Sandbox Code Playgroud)
或者ForEach {}像这样
self.Print("Inside ForEach", varOne, varTwo ...)
Run Code Online (Sandbox Code Playgroud)
Note: you might need to put Print() into a Group {} when combining with existing views
您可以在 body 结构中打印,但要这样做,您必须明确返回要渲染的视图。通常在 SwiftUI 中, body 属性会隐式返回视图。例如,当您尝试打印时,这将引发错误:
struct SomeView: View {
@State var isOpen = false
var body: some View {
print(isOpen) // error thrown here
VStack {
// other view code
|
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我们明确地返回我们想要的视图,那么它就会起作用,例如
struct SomeView: View {
@State var isOpen = false
var body: some View {
print(isOpen) // this ok because we explicitly returned the view below
// Notice the added 'return' below
return VStack {
// other view code
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想在返回视图之前查看状态或环境对象的变化情况,则上述方法会很有效,但是如果您想在要返回的视图中更深入地打印一些内容,那么我会选择@Rok Krulec回答。
小智 6
尝试右键单击实时预览播放按钮,然后从弹出窗口中选择“调试预览”
可以使用 print() ,记住所有 SwiftUI View 内容都是(a)隐式闭包,(b)强烈建议尽可能分解视图以具有简单的结构,因此它可能如下所示......
struct Model: Identifiable {
let value: String
var id: String {
value
}
init (_ value: String) {
self.value = value
}
}
struct TestView: View {
@State var showFavoritesOnly = false
@State var listData: [Model] = [Model("one"), Model("two"), Model("three")]
var body: some View {
NavigationView {
List {
Toggle(isOn: $showFavoritesOnly) {
Text("Favorite only")
}
ForEach(listData) { data in
self.rowView(data: data)
}
}
}
}
private func rowView(data: Model) -> some View {
#if DEBUG
print(">> \(data.value)")
#endif
return NavigationLink(destination: Text("Details")) {
Text("Go next from \(data.value)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
...然后右键单击“预览”以选择“作为调试预览运行”,我们得到:
2019-10-31 14:28:03.467635+0200 Test[65344:11155167] [Agent] Received connection, creating agent
2019-10-31 14:28:04.472314+0200 Test[65344:11155168] [Agent] Received display message
>> one
>> two
>> three
Run Code Online (Sandbox Code Playgroud)
在 SwiftUI 视图中调试时最安全、最简单的打印方法。
extension View {
func Print(_ item: Any) -> some View {
#if DEBUG
print(item)
#endif
return self
}
}
Run Code Online (Sandbox Code Playgroud)
使用示例:
struct ContentView: View {
var body: some View {
VStack {
ForEach((1...5), id: \.self) { number in
Text("\(number)")
.Print(number)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出:
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
您可以声明一个printing()包含print()并返回EmptyView结构的方法。
struct ContentView: View {
@State private var offset = CGSize.zero
func printing(_ items: Any...) -> some View {
let _ = print(items)
return EmptyView()
}
var body: some View {
#if DEBUG
printing(offset) // prints [(0.0, 0.0)]
#endif
ZStack {
Text("Hello")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1978 次 |
| 最近记录: |