gpt4 book ai didi

swift - 如何使用嵌套结构管理 SwiftUI 状态?

转载 作者:行者123 更新时间:2023-12-03 09:23:30 26 4
gpt4 key购买 nike

我有以下从 protobufs 生成的结构,所以它们不能直接修改:

// This file can not be modified
// It's auto-generated from protobufs

struct Shelf {
var id: Int
var title: String

var books: [Books]
}

struct Book {
var id: Int
var title: String

var pages: [Pages]
var shelfId: Int
}

struct Page {
var id: Int
var content: String

var bookId: Int
}

在使用 Books+Pages 创建或修改新书架时,在 3 个嵌套的 SwiftUI View 之间传递状态的正确方法是什么?我希望允许用户通过嵌套 View 一次创建整个书架,并在他位于顶部 View 并单击“保存”时将书架 + 书籍 + 页面保存到后端一次。

views

我试图为对象创建一个扩展以符合“ObservableObject”,但失败了: Non-class type 'Shelf' cannot conform to class protocol 'ObservableObject'

最佳答案

我做了完整的项目,来演示如何传递数据。
它可以在 GitHub 上获得,地址是 GeorgeElsham/BookshelvesExample如果您想下载完整项目以查看所有代码。这是项目的样子:
GIF of project
这个项目与我对 SwiftUI - pass data to different views 的回答非常相似。 .
作为总结,我创建了一个 ObservableObject@EnvironmentObject 一起使用.它看起来像这样:

class BookshelvesModel: ObservableObject {

@Published var shelves = [...]
var books: [Book] {
shelves[shelfId].books
}
var pages: [Page] {
shelves[shelfId].books[bookId].pages
}

var shelfId = 0
var bookId = 0

func addShelf(title: String) {
/* ... */
}
func addBook(title: String) {
/* ... */
}
func addPage(content: String) {
/* ... */
}

func totalBooks(for shelf: Shelf) -> String {
/* ... */
}
func totalPages(for book: Book) -> String {
/* ... */
}
}
然后使用 NavigationLink 连接所有 View .希望这对你有用!

如果您手动重新制作,请确保更换
let contentView = ContentView()
let contentView = ContentView().environmentObject(BookshelvesModel())
SceneDelegate.swift .

关于swift - 如何使用嵌套结构管理 SwiftUI 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59709165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com