SwiftUI 和 UIViewRepresentable 不一致的行为:为什么相同的代码在不同的项目中不起作用?

问题描述

我有一个结合了多个游戏的 SwiftUI 项目。其中一个游戏使用三个文件一个 View、一个 viewmodel 和一个 UIViewRepresentable 内的 UIPickerView。 通过该项目的多个版本,一切正常。游戏作为独立游戏运行良好。但是当我最近将代码移动到项目的不同版本时,即使我对相关代码(视图、pickerview 等)完全没有进行任何更改,并且即使新项目基本上只是一个简化版本,pickerview 也不再起作用原件的。此外,很奇怪(至少对我而言),我期望的功能是在 Canvas Preview 中实现的,但不是在模拟器或真实设备中实现的
相关代码行如下来自 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,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 上的好人,他们以前多次来救过我,我希望可以这样做又来了!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)