Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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保存新对象并导航到它_Swift_Swiftui_Swiftui Navigationlink - Fatal编程技术网

SwiftUI保存新对象并导航到它

SwiftUI保存新对象并导航到它,swift,swiftui,swiftui-navigationlink,Swift,Swiftui,Swiftui Navigationlink,当按下NavigationLink时,我想创建一个对象(按该对象的时间),将其添加到savedObjects中,然后将新对象传递到目标视图。 在视图更新时,如何在不更改状态的情况下执行此操作 struct ContentView:View{ @国家私有变量savedObjects=[ 肌体( id:0, 日期:日期() ), 肌体( id:1, 日期:日期() ), 肌体( id:2, 日期:日期() ), 肌体( id:3, 日期:日期() ) ] var body:一些观点{ 导航视图{ 名

当按下NavigationLink时,我想创建一个对象(按该对象的时间),将其添加到
savedObjects
中,然后将新对象传递到目标视图。 在视图更新时,如何在不更改状态的情况下执行此操作

struct ContentView:View{
@国家私有变量savedObjects=[
肌体(
id:0,
日期:日期()
),
肌体(
id:1,
日期:日期()
),
肌体(
id:2,
日期:日期()
),
肌体(
id:3,
日期:日期()
)
]
var body:一些观点{
导航视图{
名单{
NavigationLink(“保存新对象并导航到它”,目标:DestinationView(对象:MyObject(id:Int.random(in:10…1000),日期:date()))
ForEach(savedObjects){中的对象
NavigationLink(“导航到对象\(object.id)”,目标:DestinationView(对象:object))
}
}
}
}
}
MyObject类:可观察对象,可识别{
变量id:Int
var日期:日期
init(id:Int,date:date){
self.id=id
self.date=日期
}
}
结构目标视图:视图{
@ObservedObject变量对象:MyObject
var body:一些观点{
VStack{
文本(“对象\(object.id)”)
文本(“日期:\(object.date.description)”)
}
}
}

这是一个解决方案,当链接出现时,用新日期刷新状态

struct LinkWithPayloadView: View {
    @State private var date = Date()
    
    var body: some View {
        NavigationView {
            navigationLink(payload: "Cookies and Milk", date: date)
                .onAppear(perform: {
                    date = Date()
                })
        }
    }
    
    func navigationLink(payload: String, date: Date) -> some View {
        let formatter = DateFormatter()
        formatter.dateFormat = "HH:mm:ss"
        let payload = Payload(timestamp: date, inners: payload)

        let vstack = VStack {
            Text("\(payload.inners)")
            Text("\(formatter.string(from: payload.timestamp))")
        }

        return NavigationLink(payload.inners, destination: vstack)
    }
    
    struct Payload {
        let timestamp : Date
        let inners : String
    }
}

我的问题是,为什么不能创建一个单独的目标视图来保存对象?这样,您就不必担心将其保存在起始视图中

struct DestinationView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@ObservedObject var object: MyObject

init(id : Int, date : Date) {
    let myObject = MyObject(context: managedObjectContext)
    myObject.date = date
    myObject.id = id
    try! managedObjectContext.save()
    self.object = myObject
}

var body: some View {
    VStack {
        Text("object \(object.id)")
        Text("date: \(object.date.description)")
    }
}
}

然后,当导航关闭时,您可以从coredata重新加载对象。

我认为编程导航是我的最佳解决方案。因此,单击另一个按钮创建并保存对象,然后创建一个新的NavigationLink,然后立即启动导航,如下所述:

在我的例子中,我需要将新创建的对象保存到CoreData。我只想在按下NavigationLink时将对象保存在CoreData中一次。这听起来更像是一个按钮,而不是导航链接。你能发布你的用户界面截图吗?这听起来像是一个操作表或popover可能是一个选项。为了创建一个新对象,我希望具有与导航到现有对象相同的行为。此代码不起作用,因为您在初始化self之前使用managedObjectContext,但即使我从ContentView传入managedObjectContext,我在传入FetchRequest时也会出现非常奇怪的行为ContentView.you无需将managedObjectContext作为环境变量传递给应用程序文件app{let context=CoreDataStore.sharedInstance.managedContext变量body:some场景{WindowGroup{ContentView().environment(\.managedObjectContext,context)}我的Swift编译器不同意。您设置了环境变量吗?要深入了解CoreData,请看斯坦福CS193P的第12课:。为了确保新项目和编辑项目具有相同的用户体验,本课程建议使用草稿。这样,用户也可以放弃编辑。很好的课程,强烈推荐所有的视频。