微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于 SwiftUI 视图和 CoreData 的两个问题

如何解决关于 SwiftUI 视图和 CoreData 的两个问题

我有 2 个具有父子关系的 CoreData 对象。我需要列出所有孩子并通过点击按钮添加孩子。新孩子必须在点击后立即出现在列表中。

下面是实验视图的代码。 如您所见,它显示了包含在父对象中的子对象列表。 它以两种方式添加新子项:1) 立即在按钮操作中和 2) 使用 .actionSheet 修饰符进行确认。

问题是:

  1. 为什么方法 2 添加刷新列表方法 1 不刷新?
  2. 如何使方法 1 起作用(无需确认即可添加)?
struct ObjectEditorView: View {

    init(editingObject parent: ParentObjectEntity? = nil)
    {
        let context = NSManagedobjectContext.main.newChildViewContext()

        self._editingObject = State(initialValue: {
            if let parent = parent
            {
                return (context.object(with: parent.objectID) as! ParentObjectEntity)
            }
            else
            {
                return ParentObjectEntity(context: context)
            }
        }())

        editingContext = context
    }

    @State var editingObject: ParentObjectEntity

    private let editingContext: NSManagedobjectContext

    @State private var addingItem = false

    fileprivate func AddChild()
    {
        let order = editingObject.orderedChildren.count

        let child = ChildobjectEntity(context: editingContext)

        child.parent = editingObject

        child.title = "Child \(order + 1)"
        child.order = Int16(order)
    }

    var body: some View {
        NavigationView
        {
            vstack
            {
                HStack
                {
                    Spacer()

                    Button(action: { addingItem = true })
                    {
                        Label("Method 1",systemImage: "plus")
                    }

                    Button(
                        action:
                        {
                            AddChild()
                        })
                    {
                        Label("Method 2",systemImage: "plus")
                    }
                }
                .padding()

                List
                {
                    ForEach(editingObject.orderedChildren,id: \.self)
                    { item in
                        NavigationLink(
                            destination: Text("Destination"),isActive: .constant(false),label: { Text(item.title) })
                    }
                }

            }
            .actionSheet(isPresented: $addingItem)
            {
                ActionSheet(
                    title: Text("Add new child?"),message: nil,buttons:
                        [
                            .default(Text("Yes"))
                            {
                                AddChild()
                                addingItem = false
                            },.cancel
                            {
                                addingItem = false
                            }

                        ])
            }
        }
    }
}

ParentObjectEntityChildobjectEntity 是 CoreData 托管对象:

@objc(ParentObjectEntity)
public class ParentObjectEntity: NSManagedobject {

var orderedChildren: [ChildobjectEntity] { children?.sorted{ $0.order < $1.order } ?? [] }

}

extension ParentObjectEntity {

    @NSManaged public var title_: String?
    @NSManaged public var children: Set<ChildobjectEntity>?

}
@objc(ChildobjectEntity)
public class ChildobjectEntity: NSManagedobject {

var title: String {
    get { title_ ?? "UnkNown child" }
    set { title_ = newValue }
}

}

extension ChildobjectEntity {
    @NSManaged public var title_: String?
    @NSManaged public var order: Int16
    @NSManaged public var parent: ParentObjectEntity?

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。