SwiftUI教程代码出现错误“无法推断出通用参数'Label'”

时间:2019-11-12 15:12:43

标签: swiftui

我正在通过以下SwiftUI教程进行工作: https://developer.apple.com/tutorials/swiftui/handling-user-input

在“在视图中采用模型对象”部分的第3步中,我在第16行的Toggle语句中收到此错误:“无法推断出通用参数'Label'。”

我的代码与本教程中提供的代码相同:

import SwiftUI

struct LandmarkList: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $userData.showFavoritesOnly) {
                    Text("Favorites Only")
                }
                ForEach(userData.landmarkData) { landmark in
                    if !self.userData.showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
            LandmarkList()
                .previewDevice(PreviewDevice(rawValue: deviceName))
                .previewDisplayName(deviceName)
        }
    }
}

当我查看“ Complete”文件夹中提供的代码时,我看到了几乎相同的内容,只是将userData变量设为私有-我将其添加到“ StartingPoint”版本中,尽管我无法想象为什么会有所作为,当然它仍然会给出相同的错误,并且不会生成。我可以构建和运行完整版,因此很明显,要求通用参数的消息是错误的,它必须与其他项目有关,例如在设置中如何配置项目。

我记得今年夏天早些时候在本教程的不同部分中遇到了类似问题,并发现了一个帖子,其中有人解释了为什么代码可以在一个项目中而不是在另一个项目中工作,但是我现在找不到该帖子。

有人知道这个问题吗?在这样的视图中可以在切换控件中引用可观察对象之前,还需要了解有关如何配置项目的其他信息吗?

3 个答案:

答案 0 :(得分:2)

因此,正如我在评论中提到的:只需在您的.environmentObject(UserData())结构的ForEach()下添加LandmarkList_Previews

这将导致:

import SwiftUI

struct LandmarkList: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $userData.showFavoritesOnly) {
                    Text("Favorites Only")
                }
                ForEach(userData.landmarkData) { landmark in
                    if !self.userData.showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(destination: LandmarkDetail(landmark: landmark)
                            .environmentObject(self.userData)
                        ) {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
            LandmarkList()
                .previewDevice(PreviewDevice(rawValue: deviceName))
                .previewDisplayName(deviceName)
        }.environmentObject(UserData())
    }
}

答案 1 :(得分:1)

今天我遇到了完全相同的问题,Ravi Mishra's评论为我解决了这个问题(对您表示敬意)。一定是自动完成错误。

ForEach(userData.landmarkData)应该改为ForEach(userData.landmarks)

答案 2 :(得分:0)

我花了一周的时间来学习本教程,通过再次下载该教程文件逐行浏览了两次。我确保教程中工作的每个字符都与完成的项目的每个字符相匹配(两次),而且在输入最终代码后,仍然弹出讨厌的错误消息。堆栈溢出是我的最后一站;当我读到解决方案要包括'.environmentObject(UserData())'时,我直接进入我的代码以添加它,但是它已经存在了!
出于绝望,我决定将正文的(完全相同)代码从完成的项目的源复制到我的教程项目的源。错误消失了。
我认为@krjw有一点。