Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui viewModel和TextField存在问题_Swiftui - Fatal编程技术网

Swiftui viewModel和TextField存在问题

Swiftui viewModel和TextField存在问题,swiftui,Swiftui,我不确定这是SwiftUI错误还是我的错: 当我在TextField中键入一些文本并按下键盘上的返回按钮(以隐藏键盘)时,键入的文本将被删除,TextField再次为空。我已经在不同的模拟器和真实设备上尝试过这个解决方案。这个问题每次都会出现。我使用的是iOS 14.3,Xcode 12.4 TextField查看: struct CreateNewCard: View { @ObservedObject var viewModel: CreateNewCardViewModel

我不确定这是SwiftUI错误还是我的错:

当我在
TextField
中键入一些文本并按下键盘上的返回按钮(以隐藏键盘)时,键入的文本将被删除,
TextField
再次为空。我已经在不同的模拟器和真实设备上尝试过这个解决方案。这个问题每次都会出现。我使用的是iOS 14.3,Xcode 12.4

TextField
查看:

struct CreateNewCard: View {
    @ObservedObject var viewModel: CreateNewCardViewModel
    var body: some View {
        TextField("placeholder...", text: $viewModel.definition)
            .foregroundColor(.black)
    }
}
视图模型:

class CreateNewCardViewModel: ObservableObject {
    @Published var definition: String = "" 
}
主要观点:

struct MainView: View {
    @State var showNew = false

    var body: some View {
    Button(action: { showNew = true }, label: { Text("Create") })
        .sheet(isPresented: $showNew, content: {
            CreateNewCard(viewModel: CreateNewCardViewModel())
        })
    }
}
@迅捷朋克:这是我的第二个问题:

假设我的视图模型有一个附加参数(
id
):

在我创建视图到viewModel时,需要传递此参数。对于本例,假设我们迭代了一些id为的元素:

struct MainView: View {
@State var showNew = false

var body: some View {
ForEach(0...10, id: \.self) { index in // <<<---- this represents the id
    Button(action: { showNew = true }, label: { Text("Create") })
        .sheet(isPresented: $showNew, content: {
            // now I have to pass the id, but this 
            // is the same problem as before 
            // because now I create every time a new viewModel, right?
            CreateNewCard(viewModel: CreateNewCardViewModel(id: index))  
        })
    }
}
struct MainView:View{
@状态变量showNew=false
var body:一些观点{

ForEach(0…10,id:\.self){index in/您的问题就在这里,您没有在主视图中创建StateObject,并且每次按下键盘上的键时,您都创建了一个新模型,默认为空

import SwiftUI

struct ContentView: View {
    
    @State var showNew = false
    
    @StateObject var viewModel: CreateNewCardViewModel = CreateNewCardViewModel()  // <<: Here

    var body: some View {
    Button(action: { showNew = true }, label: { Text("Create") })
        .sheet(isPresented: $showNew, content: {
            CreateNewCard(viewModel: viewModel)
        })
    }
}


嘿,谢谢。这很有道理……但我想知道如果我需要为单个元素创建一个viewModel,我该如何解决我的问题?假设我有一个带有一些元素的
列表
,对于每个元素,我需要一个特定的viewModel,我必须将其作为参数传递(例如
viewModel(elem:element1)
)?一个“固定的”StateObject已经不可能了,对吗?不客气,我在理解和阅读你的代码方面有问题,你能提出一个问题并在那里显示代码,然后我们一起在那里工作吗?我已经添加了第二个问题。谢谢!:)@Erik:谢谢添加你的问题,但我想告诉你,提出一个新问题,我们不能在一个问题中有两个问题发帖,你的问题可能因此被删除或关闭,所以请将此问题编辑到第一个问题,并为第二个问题生成新问题,我来回答新问题。哦,好了,完成了:)
import SwiftUI

struct ContentView: View {
    
    @State var showNew = false
    
    @StateObject var viewModel: CreateNewCardViewModel = CreateNewCardViewModel()  // <<: Here

    var body: some View {
    Button(action: { showNew = true }, label: { Text("Create") })
        .sheet(isPresented: $showNew, content: {
            CreateNewCard(viewModel: viewModel)
        })
    }
}
struct CreateNewCard: View {

    @ObservedObject var viewModel: CreateNewCardViewModel

    var body: some View {

        TextField("placeholder...", text: $viewModel.definition)
            .foregroundColor(.black)

    }
}
class CreateNewCardViewModel: ObservableObject {
    @Published var definition: String = ""
}