Swift Playgrounds (iPad) 未构建具有已实现 ARSessionDelegate.session(_:didUpdate:) 函数的应用
Swift Playgrounds (iPad) does not build an app with implemented ARSessionDelegate.session(_:didUpdate:) functions
我在尝试根据 Apple 的官方示例 “Building an immersive experience with RealityKit” 实现 ARView
和 ARSessionDelegate
的 SwiftUI 表示时发现错误。
有错误
Method '__preview__session(_:didUpdate:)' with Objective-C selector '__preview__session:didUpdate:' conflicts with previous declaration with the same Objective-C selector
我准备了以下示例来轻松重现这一点。
import ARKit
import RealityKit
import SwiftUI
struct ContentView: View {
var body: some View {
RealityKitView()
}
}
private struct RealityKitView: UIViewRepresentable {
class Coordinator: NSObject, ARSessionDelegate {
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { }
func session(_ session: ARSession, didUpdate frame: ARFrame) { }
}
func makeCoordinator() -> Coordinator { Coordinator() }
func makeUIView(context: Context) -> ARView {
let view = ARView()
let session = view.session
let config = ARWorldTrackingConfiguration()
config.planeDetection = [.horizontal]
session.run(config)
session.delegate = context.coordinator
return view
}
func updateUIView(_ view: A. RView, context: Context) { }
}
一个非常有趣的时刻是,上面的这段代码可以使用一般 Swift Playgrounds 的游乐场或 Xcode 成功构建,但不能在 Swift Playgrounds 的应用程序中构建。
有什么解决方法吗?
此外,从同一个 Apple 的 Underwater 示例 (FoodPool.swift
) 中发现了另一个奇怪的错误 'Scene' is ambiguous for type lookup in this context
。我简化了内容以说明问题出在哪里,但是这段代码没有任何问题。
import RealityKit
class FoodPool {
private let arView: ARView
private var scene: Scene { arView.scene } // Error: 'Scene' is ambiguous for type lookup in this context
init(arView: ARView) {
self.arView = arView
}
}
除了 ARSessionDelegate
问题之外,这个问题可以通过直接使用 arView.scene
来解决(删除第 5 行会有帮助)。
总的来说,似乎隐藏着更复杂的问题。
解决方法
给定 一个带有 fake :D 错误的文件,并且已在文件中完成计划的更改,当 选择了另一个有效文件,并重新加载项目(或 Swift 重述 Playgrounds), 然后 项目可以 运行 成功如果没有其他错误,请离开。
这帮助我解决了 ARSessionDelegate
问题,并在 iPad 上 运行 宁 the Underwater example。
我在尝试根据 Apple 的官方示例 “Building an immersive experience with RealityKit” 实现 ARView
和 ARSessionDelegate
的 SwiftUI 表示时发现错误。
有错误
Method '__preview__session(_:didUpdate:)' with Objective-C selector '__preview__session:didUpdate:' conflicts with previous declaration with the same Objective-C selector
我准备了以下示例来轻松重现这一点。
import ARKit
import RealityKit
import SwiftUI
struct ContentView: View {
var body: some View {
RealityKitView()
}
}
private struct RealityKitView: UIViewRepresentable {
class Coordinator: NSObject, ARSessionDelegate {
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { }
func session(_ session: ARSession, didUpdate frame: ARFrame) { }
}
func makeCoordinator() -> Coordinator { Coordinator() }
func makeUIView(context: Context) -> ARView {
let view = ARView()
let session = view.session
let config = ARWorldTrackingConfiguration()
config.planeDetection = [.horizontal]
session.run(config)
session.delegate = context.coordinator
return view
}
func updateUIView(_ view: A. RView, context: Context) { }
}
一个非常有趣的时刻是,上面的这段代码可以使用一般 Swift Playgrounds 的游乐场或 Xcode 成功构建,但不能在 Swift Playgrounds 的应用程序中构建。
有什么解决方法吗?
此外,从同一个 Apple 的 Underwater 示例 (FoodPool.swift
) 中发现了另一个奇怪的错误 'Scene' is ambiguous for type lookup in this context
。我简化了内容以说明问题出在哪里,但是这段代码没有任何问题。
import RealityKit
class FoodPool {
private let arView: ARView
private var scene: Scene { arView.scene } // Error: 'Scene' is ambiguous for type lookup in this context
init(arView: ARView) {
self.arView = arView
}
}
除了 ARSessionDelegate
问题之外,这个问题可以通过直接使用 arView.scene
来解决(删除第 5 行会有帮助)。
总的来说,似乎隐藏着更复杂的问题。
解决方法
给定 一个带有 fake :D 错误的文件,并且已在文件中完成计划的更改,当 选择了另一个有效文件,并重新加载项目(或 Swift 重述 Playgrounds), 然后 项目可以 运行 成功如果没有其他错误,请离开。
这帮助我解决了 ARSessionDelegate
问题,并在 iPad 上 运行 宁 the Underwater example。