使用协议定义swiftui视图的属性
我有多个类要与预算选取器视图一起使用。他们都定义了这个可预算协议使用协议定义swiftui视图的属性,swiftui,Swiftui,我有多个类要与预算选取器视图一起使用。他们都定义了这个可预算协议 import SwiftUI struct BudgetPickerView: View { @EnvironmentObject var userData: UserData @State var budgetable: Budgetable ... } 例如,这个分配类 import Foundation import Combine class Allocation: ObservableObj
import SwiftUI
struct BudgetPickerView: View {
@EnvironmentObject var userData: UserData
@State var budgetable: Budgetable
...
}
例如,这个分配类
import Foundation
import Combine
class Allocation: ObservableObject, Identifiable, Budgetable {
let objectWillChange = ObservableObjectPublisher()
let id: String?
var amount: String { willSet { self.objectWillChange.send() } }
var budgetId: String { willSet { self.objectWillChange.send() } }
init(id: String? = nil, amount: String, budgetId: String) {
self.id = id
self.amount = amount.removePrefix("-")
self.budgetId = budgetId
}
}
然而,当我试图将分配传递到我的预算选择器视图时,我得到了一个错误
NavigationLink(destination: BudgetPickerView(budgetable: allocation))...
无法将“NavigationLink>,BudgetPickerView>”类型的返回表达式转换为返回类型“some View”
表达式类型“BudgetPickerView”不明确,没有更多上下文
更改为以下代码
struct BudgetPickerView: View {
@EnvironmentObject var userData: UserData
var budgetable: Budgetable
var body: some View {
...
}
}
及
根据SwiftUI的概念,您不允许在视图外使用
@State
,但以下操作效果良好(其他部件保持不变)
struct BudgetPickerView:View{
@国家私有var预算表:预算表
初始(预算表:预算表){
_budgetable=状态(初始值:budgetable)
}
var body:一些观点{
文本(“你好,世界!”)
}
}
结构TestBudgetPickerView:视图{
var body:一些观点{
导航视图{
导航链接(目的地:
BudgetPickerView(预算表:分配(金额:“10”,预算TID:“1”))
{文本(“项目”)}
}
}
}
顺便说一句,以防万一,@State再次被设计成只保存临时视图状态数据,而不是模型。对于模型,最好使用
可观察对象
。在您的情况下,BudgetTable
看起来像一个模型。首先需要传递像NavigationLink这样的环境对象(目标:BudgetPickerView(BudgetTable:allocation)。已在场景委托上设置的环境对象(UserData()),当我添加以下内容时,它也不会删除错误:无论您在何处调用BudgetPickerView,都必须传递EnvironmentObject,即使我这样做,同样的错误仍然存在,并且为什么您作为param BudgetPickerView(BudgetTable:allocation)传递,您的BudgetTable似乎是BudgetPickerView中的状态?这不起作用,你必须用.environmentObject
添加环境对象,否则你会得到一个不同的错误,但通过修复,我会得到与我在问题中发布的相同的错误。对,但你不能将ObserveObject与协议一起使用
struct BudgetPickerView: View {
@EnvironmentObject var userData: UserData
var budgetable: Budgetable
var body: some View {
...
}
}
NavigationLink(destination: BudgetPickerView(budgetable: allocation).EnvironmentObject(UserData()))
struct BudgetPickerView: View {
@State private var budgetable: Budgetable
init(budgetable: Budgetable) {
_budgetable = State<Budgetable>(initialValue: budgetable)
}
var body: some View {
Text("Hello, World!")
}
}
struct TestBudgetPickerView: View {
var body: some View {
NavigationView {
NavigationLink(destination:
BudgetPickerView(budgetable: Allocation(amount: "10", budgetId: "1")))
{ Text("Item") }
}
}
}