使用 MapKit 和 SwiftUI(版本 12.0 beta 2 (12A6163b))放大/缩小地图时,终端会生成数百条这样的行:
2020-07-21 21:05:39.310719-0500 MyApp[95733:4195994] [VKDefault] 不可见矩形请求样式 Z
import SwiftUI
import MapKit
@main
struct MapTest: App {
var body: some Scene {
WindowGroup {
MapView()
}
}
}
struct MapView: View {
var body: some View {
Map()
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}
struct Map: UIViewRepresentable {
func makeUIView(context: Context) -> MKMapView {
let map = MKMapView()
map.delegate = context.coordinator
return map
}
func …Run Code Online (Sandbox Code Playgroud) 我整理了一个简单的项目来构建在 swift 中使用类和结构的理解。在模拟器上运行此代码时,我收到以下警告:
内容视图.swift
import SwiftUI
struct ContentView: View {
@EnvironmentObject var app: App
var body: some View {
VStack{
ForEach(app.users.names, id: \.self) { name in
Text("\(name)")
}
Spacer()
Button(action: {self.app.users.add()}) {
Text("add")
}
}
}
}
class App: ObservableObject {
@Published var users = Users()
}
struct Users {
var names = ["Mac", "Alex", "Kevin"]
mutating func add() {
names.append("NEW GUY")
}
}
Run Code Online (Sandbox Code Playgroud)
SceneDelegate.swift
var app = App()
let contentView = ContentView().environmentObject(app)
Run Code Online (Sandbox Code Playgroud)
输出:
2019-10-23 14:55:51.207032-0500 ExtendedClassDemo[43035:1908988] [AXRuntimeCommon] 类 'SwiftUI.AccessibilityNode' …
FirstView Appeared打印两次。首次加载视图时一次,选择 NavigationLink 时再次加载。
import SwiftUI
struct FirstView: View {
var body: some View {
NavigationView{
ZStack{
Text("FirstView").onAppear(perform: {print("FirstView Appeared")})
NavigationLink(destination: SecondView()) {
Text("Goto SecondView")
}.offset(y: 50)
}
}
}
}
struct SecondView: View {
var body: some View {
Text("SecondView").onAppear(perform: {print("SecondView Appeared")})
}
}
Run Code Online (Sandbox Code Playgroud)
在模拟器和个人设备上运行上面的代码在Xcode 12.0 beta中,在选择NavigationLink时,在下面的Xcode 12.0 Beta中会产生下面的输出:
FirstView Appeared
FirstView Appeared
SecondView Appeared
Run Code Online (Sandbox Code Playgroud)
这是 onAppear() 预期行为的重复吗?
如果是这样,有什么最佳实践可以在firstview创建时加载一些数据,然后返回到firstview(因为 onAppear() 会在导航离开时尝试加载一些数据firstView)