Swiftui - 显示要查看的解码数据时出错
Swiftui - Error displaying decoded data to view
我无法通过传递到我的视图的环境对象将我解码为结构的数据显示到我的视图。显示的错误消息是“在对初始化程序的调用中没有完全匹配”。我一直想弄明白,但运气不好。
这是我的网络文件的一些代码,用作解码结构的真实来源
class AuthViewModel: ObservableObject {
@Published var user: LoginResponseData.Root? = nil
@Published var alert: CustomAlert? = nil
@Published var claimHistroy: ClaimStruct? = nil
var authentication: AuthenticationCheck? = nil
var showLoader = false
let networkService: NetworkService = NetworkService.shared
func signIn(username: String, password: String) {
networkService.signIn(username: username, password: password) { (result) in
switch result {
case .success(let user):
print("This user last name is: \(user.result.login.userName.name.fullName)")
self.user = user
self.authentication?.updateValidation(success: true)
// Calls method
self.profileSessionMember()
case .failure(let error):
print("The error is: \(error.localizedDescription)")
//Reset the variable
self.user = nil
self.authentication?.updateValidation(success: false)
// Pass a message to the user
self.alert = CustomAlert(title: "Invalid Credentials", message: "Either username or password is incorrect. Please try again")
}
}
}
/// Gets the Search Savings Amouny from decoded struct
func profileSessionMember() {
networkService.profileSessionMember { result in
switch result {
case .success(let userHistory):
// Sets the claimHistory
self.claimHistroy = userHistory
case .failure(let error):
print(error)
}
}
}
class AuthenticationCheck: ObservableObject {
@Published var isValidated = false
func updateValidation(success: Bool) {
withAnimation {
isValidated = success
}
}
}
这是我的身份验证,其中 environmentObject 被传递到我的视图
@main
struct SomeApp: App {
@StateObject var authentication = AuthenticationCheck()
@StateObject var vm: AuthViewModel = AuthViewModel()
var body: some Scene {
WindowGroup {
if authentication.isValidated {
ContentView()
.environmentObject(vm)
} else {
Signin()
.environmentObject(vm)
.environmentObject(authentication)
}
//TestView()
}
}
}
这是我试图显示信息的地方
struct SearchHistory: View {
@EnvironmentObject var vm: AuthViewModel
var body: some View {
VStack {
Text("BASED ON YOUR SEARCH HISTORY")
.font(.title3)
.fontWeight(.heavy)
.foregroundColor(Color(red: 0.584, green: 0.655, blue: 0.992, opacity: 100.0))
.multilineTextAlignment(.center)
.padding()
HStack {
Image(systemName: "dollarsign.circle")
.resizable()
.frame(width: 43.0, height: 44.0)
.aspectRatio(contentMode: .fill)
.padding()
VStack{
Text("Total")
.multilineTextAlignment(.center)
Text("Amount")
.multilineTextAlignment(.center)
// This does not work
Text(vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount)
}
}
}
}
}
Text() 需要有一些字符串才能工作。由于“vm.claimHistroy”可能为零,如果它变为零,请尝试在其中包含一些文本。像这样:
Text(vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount ?? "")
你甚至可以试试这个:
if let history = vm.claimHistroy {
Text(history.result.member.yearToDateSearchSavingsAmount)
}
编辑:
如果“yearToDateSearchSavingsAmount”不是字符串,试试这个:
if let amount = vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount {
Text("\(amount)")
}
我无法通过传递到我的视图的环境对象将我解码为结构的数据显示到我的视图。显示的错误消息是“在对初始化程序的调用中没有完全匹配”。我一直想弄明白,但运气不好。
这是我的网络文件的一些代码,用作解码结构的真实来源
class AuthViewModel: ObservableObject {
@Published var user: LoginResponseData.Root? = nil
@Published var alert: CustomAlert? = nil
@Published var claimHistroy: ClaimStruct? = nil
var authentication: AuthenticationCheck? = nil
var showLoader = false
let networkService: NetworkService = NetworkService.shared
func signIn(username: String, password: String) {
networkService.signIn(username: username, password: password) { (result) in
switch result {
case .success(let user):
print("This user last name is: \(user.result.login.userName.name.fullName)")
self.user = user
self.authentication?.updateValidation(success: true)
// Calls method
self.profileSessionMember()
case .failure(let error):
print("The error is: \(error.localizedDescription)")
//Reset the variable
self.user = nil
self.authentication?.updateValidation(success: false)
// Pass a message to the user
self.alert = CustomAlert(title: "Invalid Credentials", message: "Either username or password is incorrect. Please try again")
}
}
}
/// Gets the Search Savings Amouny from decoded struct
func profileSessionMember() {
networkService.profileSessionMember { result in
switch result {
case .success(let userHistory):
// Sets the claimHistory
self.claimHistroy = userHistory
case .failure(let error):
print(error)
}
}
}
class AuthenticationCheck: ObservableObject {
@Published var isValidated = false
func updateValidation(success: Bool) {
withAnimation {
isValidated = success
}
}
}
这是我的身份验证,其中 environmentObject 被传递到我的视图
@main
struct SomeApp: App {
@StateObject var authentication = AuthenticationCheck()
@StateObject var vm: AuthViewModel = AuthViewModel()
var body: some Scene {
WindowGroup {
if authentication.isValidated {
ContentView()
.environmentObject(vm)
} else {
Signin()
.environmentObject(vm)
.environmentObject(authentication)
}
//TestView()
}
}
}
这是我试图显示信息的地方
struct SearchHistory: View {
@EnvironmentObject var vm: AuthViewModel
var body: some View {
VStack {
Text("BASED ON YOUR SEARCH HISTORY")
.font(.title3)
.fontWeight(.heavy)
.foregroundColor(Color(red: 0.584, green: 0.655, blue: 0.992, opacity: 100.0))
.multilineTextAlignment(.center)
.padding()
HStack {
Image(systemName: "dollarsign.circle")
.resizable()
.frame(width: 43.0, height: 44.0)
.aspectRatio(contentMode: .fill)
.padding()
VStack{
Text("Total")
.multilineTextAlignment(.center)
Text("Amount")
.multilineTextAlignment(.center)
// This does not work
Text(vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount)
}
}
}
}
}
Text() 需要有一些字符串才能工作。由于“vm.claimHistroy”可能为零,如果它变为零,请尝试在其中包含一些文本。像这样:
Text(vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount ?? "")
你甚至可以试试这个:
if let history = vm.claimHistroy {
Text(history.result.member.yearToDateSearchSavingsAmount)
}
编辑:
如果“yearToDateSearchSavingsAmount”不是字符串,试试这个:
if let amount = vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount {
Text("\(amount)")
}