如何在SwiftUI预览中打印?



我知道如何在SwiftUI视图中print。我想在SwiftUI预览中做同样的事情这样我就不需要在模拟器中运行应用程序来查看日志。

例如,这里我试图打印视图的帧大小:

struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Hello, world!")
}
.padding()
.background {
GeometryReader { proxy in
Color.clear
.onAppear {
print(proxy.size)
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

当在模拟器上运行应用程序时,这将正确地输出到Xcode控制台。然而,当预览显示时,Xcode控制台不会显示任何输出。两种"生活"我都试过了。和";Selectable">


我知道我可以将print切换到NSLog("SWIFTUIPREVIEWLOG: (proxy.size)"),然后在控制台搜索SWIFTUIPREVIEWLOG。但这比从Xcode控制台读取输出需要更长的时间。另外,在模拟器中运行时,输出会更混乱。

是否有一种方法来查看源自SwiftUI预览的print语句?

正式地说,你的应用程序的附加预览实例已被弃用。我以前都是走Log路线的。一旦你在控制台保存了一个过滤器,它就可以…存活下来。然而,当我试图找到一个官方的弃用来源时,我在开发论坛上偶然发现了这个帖子,最后的回复听起来很粗糙,但很有趣。由于我还没有机会尝试这种方法,我不能说它的可靠性,但似乎值得一试。(也就是说,你可能还想看看Inject框架,它使常规模拟器的实时代码注入相当轻松,而且通常比SwiftUI预览版更好。)

从Xcode 14.3.1开始,在输出窗口中有预览选项卡显示预览。

如果不可用,那么有一个简单的解决方案;

  1. 为视图创建包装器;
struct ContentViewWrapper : View {

var body: some View {
ContentView()
}
}

现在,在PreviewProvider

中调用这个包装器
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentViewWrapper()
}
}
}

现在,打印出现在控制台上玩预览。

在Xcode 13.4测试!

最新更新