SwiftUI:无法推断通用参数 'Subject'
SwiftUI: Generic parameter 'Subject' could not be inferred
我用 SwiftUI 构建了一个 LoadingView
,用于在我从 API 获取远程数据时显示我的应用程序中的一些加载内容。我正在使用 Xcode 版本 11.0 beta 5。
这是LoadingView
:
struct LoadingView<Content>: View where Content: View {
@Binding var isShowing: Bool
var content: () -> Content
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .center) {
self.content()
.disabled(self.isShowing)
.blur(radius: self.isShowing ? 3 : 0)
VStack {
Text("Loading...")
ActivityIndicator(isAnimating: .constant(true), style: .large)
}
.frame(width: geometry.size.width / 2,
height: geometry.size.height / 5)
.background(Color.white)
.foregroundColor(Color.primary)
.cornerRadius(5)
.opacity(self.isShowing ? 1 : 0)
}
}
}
}
这是我的数据存储。它被声明为ObservableObject
并且有多个@Published
属性。它还从 API:
进行一些远程获取
class CharacterStore: ObservableObject {
@Published private(set) var isLoading = false
// Fetches some stuff from a remote api
func fetch() {
self.isLoading = true
myService.getCharacters { (result) in
DispatchQueue.main.async {
self.isLoading = false
}
}
}
}
最后,这是我要显示我的 LoadingView
的视图,其中包含 ContentView
的内容。当然,我在显示此视图之前设置 @EnvironmentObject
。
struct ContentView: View {
@EnvironmentObject var charStore: CharacterStore
var body: some View {
LoadingView(isShowing: self.$charStore.isLoading) { // Here I get the error
// Show some Content here
Text("")
}
}
}
问题是我想将 self.$charStore.isLoading
绑定到 LoadingView
。在这一行中,我收到以下错误:
Generic parameter 'Subject' could not be inferred
我尝试了几种方法,但其中 none 行得通。顺便说一句:如果我在 ContentView
中使用 @State
属性 它就像这样工作得很好:
struct ContentView: View {
@EnvironmentObject var charStore: CharacterStore
@State var loads: Bool = false
var body: some View {
LoadingView(isShowing: self.$loads) { // Here I get no error
// Show some Content here
Text("")
}
}
}
我错过了什么吗?如果您需要更多信息,请告诉我,如果需要,我可以提供更多内容。
感谢您的帮助!
由于您的 LoadingView
不会修改 .isLoading,因此您无需将其作为绑定传递:
LoadingView(isShowing: self.$charStore.isLoading)
而是删除 LoadingView
中的 @Binding
:
struct LoadingView<Content>: View where Content: View {
var isShowing: Bool
...
并像这样创建它(删除美元符号):
LoadingView(isShowing: self.charStore.isLoading) { ... }
相反,如果你坚持要传递一个绑定,那么你需要把private(set)
从:
中去掉
@Published private(set) var isLoading = false
您不能执行以下操作:
将 @Binding 替换为与 ContentView 使用的相同的 @EnvironmentObject。
struct LoadingView<Content>: View where Content: View {
@EnvirontmentObject var charStore: CharacterStore // added
//@Binding var isShowing: Bool // removed
var content: () -> Content
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .center) {
self.content()
.disabled(self.$charStore.isLoading) // Changed
.blur(radius: self.$charStore.isLoading ? 3 : 0) // Changed
VStack {
Text("Loading...")
ActivityIndicator(isAnimating: .constant(true), style: .large)
}
.frame(width: geometry.size.width / 2,
height: geometry.size.height / 5)
.background(Color.white)
.foregroundColor(Color.primary)
.cornerRadius(5)
.opacity(self.$charStore.isLoading ? 1 : 0) // Changed
}
}
}
}
当然,您还必须从 ContentView 的 LoadingView() 初始化程序中删除 isShowing 参数。
如有错误请指正!
我用 SwiftUI 构建了一个 LoadingView
,用于在我从 API 获取远程数据时显示我的应用程序中的一些加载内容。我正在使用 Xcode 版本 11.0 beta 5。
这是LoadingView
:
struct LoadingView<Content>: View where Content: View {
@Binding var isShowing: Bool
var content: () -> Content
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .center) {
self.content()
.disabled(self.isShowing)
.blur(radius: self.isShowing ? 3 : 0)
VStack {
Text("Loading...")
ActivityIndicator(isAnimating: .constant(true), style: .large)
}
.frame(width: geometry.size.width / 2,
height: geometry.size.height / 5)
.background(Color.white)
.foregroundColor(Color.primary)
.cornerRadius(5)
.opacity(self.isShowing ? 1 : 0)
}
}
}
}
这是我的数据存储。它被声明为ObservableObject
并且有多个@Published
属性。它还从 API:
class CharacterStore: ObservableObject {
@Published private(set) var isLoading = false
// Fetches some stuff from a remote api
func fetch() {
self.isLoading = true
myService.getCharacters { (result) in
DispatchQueue.main.async {
self.isLoading = false
}
}
}
}
最后,这是我要显示我的 LoadingView
的视图,其中包含 ContentView
的内容。当然,我在显示此视图之前设置 @EnvironmentObject
。
struct ContentView: View {
@EnvironmentObject var charStore: CharacterStore
var body: some View {
LoadingView(isShowing: self.$charStore.isLoading) { // Here I get the error
// Show some Content here
Text("")
}
}
}
问题是我想将 self.$charStore.isLoading
绑定到 LoadingView
。在这一行中,我收到以下错误:
Generic parameter 'Subject' could not be inferred
我尝试了几种方法,但其中 none 行得通。顺便说一句:如果我在 ContentView
中使用 @State
属性 它就像这样工作得很好:
struct ContentView: View {
@EnvironmentObject var charStore: CharacterStore
@State var loads: Bool = false
var body: some View {
LoadingView(isShowing: self.$loads) { // Here I get no error
// Show some Content here
Text("")
}
}
}
我错过了什么吗?如果您需要更多信息,请告诉我,如果需要,我可以提供更多内容。
感谢您的帮助!
由于您的 LoadingView
不会修改 .isLoading,因此您无需将其作为绑定传递:
LoadingView(isShowing: self.$charStore.isLoading)
而是删除 LoadingView
中的 @Binding
:
struct LoadingView<Content>: View where Content: View {
var isShowing: Bool
...
并像这样创建它(删除美元符号):
LoadingView(isShowing: self.charStore.isLoading) { ... }
相反,如果你坚持要传递一个绑定,那么你需要把private(set)
从:
@Published private(set) var isLoading = false
您不能执行以下操作:
将 @Binding 替换为与 ContentView 使用的相同的 @EnvironmentObject。
struct LoadingView<Content>: View where Content: View {
@EnvirontmentObject var charStore: CharacterStore // added
//@Binding var isShowing: Bool // removed
var content: () -> Content
var body: some View {
GeometryReader { geometry in
ZStack(alignment: .center) {
self.content()
.disabled(self.$charStore.isLoading) // Changed
.blur(radius: self.$charStore.isLoading ? 3 : 0) // Changed
VStack {
Text("Loading...")
ActivityIndicator(isAnimating: .constant(true), style: .large)
}
.frame(width: geometry.size.width / 2,
height: geometry.size.height / 5)
.background(Color.white)
.foregroundColor(Color.primary)
.cornerRadius(5)
.opacity(self.$charStore.isLoading ? 1 : 0) // Changed
}
}
}
}
当然,您还必须从 ContentView 的 LoadingView() 初始化程序中删除 isShowing 参数。
如有错误请指正!