我有一个结合了多个游戏的 SwiftUI 项目。其中一个游戏使用三个文件:一个 View、一个 ViewModel 和一个 UIViewRepresentable 中的 UIPickerView。通过该项目的几个版本,一切正常。并且该游戏作为独立游戏运行良好。但是当我最近将代码移动到项目的不同版本时,即使我完全没有对相关代码(视图、pickerview 等)进行任何更改并且即使新项目基本上只是一个简化版本,pickerview 也不再工作原来的。此外,非常奇怪的是(至少对我而言),我期望的功能是在 Canvas Preview 中实现的,而不是在 Simulator 或 Real Device 中实现的。
UIViewRepresentable 中的相关代码行如下
import SwiftUI
import UIKit
struct SilhouettePickerView: UIViewRepresentable {
@Binding var cols: [Int]
var pickerData: [[String]] =
[
["silhouette_1", "silhouette_2", "silhouette_3" ],
["silhouette_2", "silhouette_3", "silhouette_1" ],
["silhouette_3", "silhouette_1", "silhouette_2" ]
]
func makeCoordinator() -> SilhouettePickerView.Coordinator {
return SilhouettePickerView.Coordinator(self, viewModel: MizumukeChallengeViewModel())
}
func makeUIView(context: UIViewRepresentableContext<SilhouettePickerView>) -> UIPickerView {
let picker = UIPickerView(frame: .zero)
picker.dataSource = context.coordinator
picker.delegate = context.coordinator
return picker
}
func updateUIView(_ view: UIPickerView, context: UIViewRepresentableContext<SilhouettePickerView>) {
}
class Coordinator: NSObject, UIPickerViewDataSource, UIPickerViewDelegate {
var parent: SilhouettePickerView
var correct = false
var viewModel: MizumukeChallengeViewModel
init(_ pickerView: SilhouettePickerView, viewModel: MizumukeChallengeViewModel) {
self.parent = pickerView
self.viewModel = viewModel
}
...
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let leftCol = pickerView.selectedRow(inComponent: 0)
let middleCol = pickerView.selectedRow(inComponent: 1)
let rightCol = pickerView.selectedRow(inComponent: 2)
self.parent.cols = [leftCol, middleCol, rightCol]
}
}
}
在工作项目中,pickerView(_ : didSelectRow) 成功地将 self.parent.cols 发送到对其进行评估的 viewModel。在非工作代码中,(正如我所说的)100% 相同,self.parent.cols 被传递给 viewModel 本身,但它没有被传递给评估它们的 func:
func checkAnswer() {
attempts += 1
print(self.cols) // returns [] in non-working version; [1,0,2] (etc) in working version
if self.cols == [1, 2, 0] {
solved = true
switch attempts {
case 1:
points = maxPoints
case 2:
points = maxPoints - 5
case 3:
points = maxPoints - 10
case 4:
points = maxPoints - 15
case 5...:
points = 0
default:
points = maxPoints
}
}
}
我是否需要在项目的其他地方添加或修改某些内容才能使 UIViewReprensentable 工作?当我清理项目时,我是否遗漏了一些重要的东西?起初我以为我需要在 info.plist 中添加一些东西,但是这两个在工作和非工作项目版本中是相同的。重建项目中的其他所有内容(所有其他游戏)都运行良好。正如我所说,有问题的代码在 xCode 画布预览中有效!
我四处寻找方向,但没有发现任何迹象表明我做错了什么,所以我求助于 StackOverflow 的好人,他们以前曾多次来救我,我希望能再次这样做!