Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.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
Ios 删除和编辑数组中的特定结构_Ios_Arrays_Swift_Swiftui - Fatal编程技术网

Ios 删除和编辑数组中的特定结构

Ios 删除和编辑数组中的特定结构,ios,arrays,swift,swiftui,Ios,Arrays,Swift,Swiftui,我的内容视图是一个由解码的json数组填充的表单,如下所示: struct ContentView:View{ @状态变量bookData:[Book]=加载(“列表”) @国家私有var selectedBook:Book?=无 @国家私有var active=false var body:一些观点{ 导航视图{ 形式{ ForEach(bookData){bookdeach中的详细信息 BookView(书籍:bookDetail) .背景( 导航链接(目标:EditBook(bookDat

我的内容视图是一个由解码的json数组填充的表单,如下所示:

struct ContentView:View{
@状态变量bookData:[Book]=加载(“列表”)
@国家私有var selectedBook:Book?=无
@国家私有var active=false
var body:一些观点{
导航视图{
形式{
ForEach(bookData){bookdeach中的详细信息
BookView(书籍:bookDetail)
.背景(
导航链接(目标:EditBook(bookData:$bookData,book:bookDetail),标记:bookDetail,选择:$selectedBook){
EmptyView()
}
)
.上下文菜单{
按钮(操作:{
//删除此处的操作
}) {
标签(“删除”,系统图像:“垃圾”)
}
}
}
}
.navigationBarTitle(“书籍”)
.navigationBarItems(尾随:NavigationLink(目的地:NewBook(bookData:$bookData)){Image(系统名:“plus.circle”).font(/*@START\u MENU\u TOKEN@*/.title/*@END\u MENU\u TOKEN@*/))
}
}
}
我的应用程序目前的工作方式是,NewBook和Edit book视图对我的bookData数组具有binder属性。要将新书添加到数组中,NewBook视图只需使用另一个结构追加bookData,并使用writeJSON(bookData)对其进行编码。类似地,在内容视图中,我希望使用上下文菜单删除一个元素,并对编辑的数组重新编码。对于editBook视图,我想编辑一个结构并使用writeJSON对其进行编码

以下是我的editBook视图:

struct EditBook:视图{
@绑定var bookData:[Book]
@国家私有变量名称=“”
@国家私有var author=“”
@国家私有变量页=“”
@国营私营部门var total=“”
书名:书名
var body:一些观点{
形式{
节(标题:文本(“更改本书的详细信息”)){
HStack{
文本(“名称:”)
TextField(book.name,text:$name)
}
HStack{
文本(“作者:”)
TextField(book.author,text:$author)
}
HStack{
文本(“页码:”)
TextField(book.page,text:$page)
.键盘类型(.numberPad)
}
HStack{
文本(“页数:”)
TextField(book.total,text:$total)
.键盘类型(.numberPad)
}
}
部分{
HStack{
垫片()
按钮(操作:{
}) {
文本(“更新手册”)
}
垫片()
}
}
}
.navigationTitle(“编辑书籍”)
}
}
这是一个有效的NewBook视图(供参考)

struct NewBook:View{
@绑定var bookData:[Book]
@国家私有变量名称=“”
@国家私有var author=“”
@国家私有变量页=“”
@国营私营部门var total=“”
var body:一些观点{
形式{
节(标题:文本(“输入书的详细信息”)){
文本字段(“标题”,文本:$name)
文本字段(“作者”,文本:$Author)
TextField(“当前页码”,text:$page)
.键盘类型(.numberPad)
TextField(“总页数”,文本:$Total)
.键盘类型(.numberPad)
}
部分{
HStack{
垫片()
按钮(操作:{
append(Book(id:UUID(),name:name,author:author,page:page,total:total,image:string)))
writeJSON(图书数据)
}) {
文本(“添加书本”)
}
垫片()
}
}
}
.navigationTitle(“新书”)
}
}

我尝试在内容视图中使用
bookData.removeAll(其中:{bookData.contains(bookDetail)})
,但它删除了所有内容。

好的,经过一些尝试和错误,下面是对我有效的方法

要删除一个元素,我将此代码放在内容视图的按钮中

bookData.removeAll(其中:{$0.id==bookdeail.id})
writeJSON(图书数据)
为了编辑数据,我这样做了

let id=book.id
bookData.removeAll(其中:{$0.id==book.id})
让temp=Book(id:id,name:name,author:author,page:page,total:total,image:“image”)
bookData.insert(临时,在:0)
writeJSON(图书数据)

注意编辑时id是如何保持不变的。

我将从重构开始使用模型对象。此对象应包含书本数组以及处理序列化/反序列化。你可以让你的书符合
可识别的
(或者至少有一个唯一的标识符),这样你的模型就可以很容易地识别出你要的书edited@Paulw11book struct已经符合uuid,我不明白为什么我应该将数组变成一个struct(我能想到的唯一原因就是这样)