Ios `UIViewControllerRepresentable`长按后,表格视图消失

Ios `UIViewControllerRepresentable`长按后,表格视图消失,ios,swift,swiftui,swift-composable-architecture,Ios,Swift,Swiftui,Swift Composable Architecture,我为UITableViewController提供了一个UIViewControllerRepresentable包装器,并且正在使用,这可能与问题无关 下面是我的表视图包装代码,包括上下文菜单代码(我省略了很多设置代码): 公共结构列表:UIViewControllerRepresentable,KeyPathUpdateable 其中数据:集合,行内容:视图,行预览:视图,目标:视图,EachState:Identifiable,EachState.ID==ID{ 私有var actionP

我为
UITableViewController
提供了一个
UIViewControllerRepresentable
包装器,并且正在使用,这可能与问题无关

下面是我的表视图包装代码,包括上下文菜单代码(我省略了很多设置代码):

公共结构列表:UIViewControllerRepresentable,KeyPathUpdateable 其中数据:集合,行内容:视图,行预览:视图,目标:视图,EachState:Identifiable,EachState.ID==ID{ 私有var actionProvider:(IndexSet)->UIMenu?={innil} 私有变量预览提供程序:(存储)->行预览?={innil} //设置代码 public func makeUIViewController(上下文:context)->UITableViewController{ 让tableViewController=UITableViewController() tableViewController.tableView.translatesAutoresizingMaskIntoConstraints=false tableViewController.tableView.dataSource=context.coordinator tableViewController.tableView.delegate=context.coordinator tableViewController.tableView.separatorStyle=.none tableViewController.tableView.register(HostingCell.self,forCellReuseIdentifier:“单元格”) 返回tableViewController } public func updateUIViewController(uController:UITableViewController,context:context){ context.coordinator.rows=data.enumerated().map{offset,项目位于 作用域(状态:{$0[safe:offset]??item}, 操作:{(item.id,$0)}) } controller.tableView.reloadData() } 公共函数makeCoordinator()->Coordinator{ 协调员(行:[], 内容:内容,, onDelete:onDelete, actionProvider:actionProvider, previewProvider:previewProvider, 目的地:目的地) } 公共函数预览提供程序(u提供程序:@escaping(Store)->RowPreview?->Self{ 更新(\.previewProvider,值:provider) } 公共func目标(u提供程序:@escaping(Store)->destination?->Self{ 更新(\.目的地,值:提供程序) } 公共类协调器:NSObject、UITableViewDataSource、UITableViewDelegate{ fileprivate变量行:[存储] 私有变量内容:(存储)->行内容 私有var actionProvider:(IndexSet)->UIMenu? 私有变量预览提供程序:(存储)->行预览? public func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{ 行数 } public func tableView(tableView:UITableView,cellForRowAt indexPath:indexPath)->UITableViewCell{ guard let tableViewCell=tableView.dequeueReusableCell(标识符为:“Cell”,for:indexPath)作为?HostingCell, let view=rows[safe:indexPath.row]else{ 返回UITableViewCell() } tableViewCell.setup(带有:内容(视图)) 返回表视图单元格 } public func tableView(tableView:UITableView,commit editingStyle:UITableViewCell.editingStyle,forRowAt indexPath:indexPath){ 如果editingStyle==.delete{ onDelete(索引集(整数:indexath.item)) } } public func tableView(tableView:UITableView,contextMenuConfigurationForRowAt indexath:indexPath,point:CGPoint)->UIContextMenuConfiguration{ guard let store=rows[safe:indexPath.row]else{return nil} 返回UIContextMenuConfiguration( 标识符:无, 预览提供程序:{ guard let preview=self.previewProvider(store)else{return nil} let hosting=UIHostingController(rootView:preview) 返回主机 }, actionProvider:{uu}in actionProvider(IndexSet(整数:indexPath.item)) }) } } }
私有类HostingCell:UITableViewCell{
var主机:UIHostingController?
func设置(带视图:内容){
如果主机==nil{
let controller=UIHostingController(rootView:view)
主机=控制器
guard let content=controller.view else{return}
content.translatesAutoResizezingMaskintoConstraints=false
contentView.addSubview(内容)
content.topAnchor.constraint(equalTo:contentView.topAnchor).isActive=true
content.leftAnchor.constraint(equalTo:contentView.leftAnchor).isActive=true
content.bottomAnchor.constraint(equalTo:contentView.bottomAnchor).isActive=true
content.rightAnchor.constraint(equalTo:contentView.rightAnchor).isActive=true
}否则{
主机?.rootView=view
}
setNeedsLayout()
}
}
下面是一个示例用法:

private struct ClassView: View {
    let store = Store<ClassState, ClassAction>(
        initialState: ClassState(),
        reducer: classReducer,
        environment: ClassEnv()
    )

    var body: some View {
        WithViewStore(store) { viewStore in
            CoreInterface.List(store.scope(state: \.people, action: ClassAction.personAction)) { store in
                PersonView(store: store)
            }
            .actionProvider { indices in
                let delete = UIAction(title: "Delete", image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
                    viewStore.send(.remove(indices))
                }

                return UIMenu(title: "", children: [delete])
            }
            .previewProvider { viewStore in
                Text("preview")
            }
        }
    }
}
私有结构类视图:视图{
让商店(
initialState:ClassState(),
减速器:classReducer,
环境:ClassEnv()
)
var body:一些观点{
WithViewStore(存储){viewStore in
列表(store.scope(state:\.people,action:ClassAction.personAction)){storein
PersonView(商店:商店)
}
.actionProvider{中的索引
让delete=UIAction(标题:“删除”,图像:UIImage(系统名:“垃圾”),属性:。破坏性){in
发送(.remove(索引))
}
返回菜单(标题:,子项:[删除])
}
.previewProvider{viewStore in
文本(“预览”)
}
}
}
}
问题如下:当我长按单元格以显示关联菜单,然后关闭它并向上滚动时,表格视图消失。这只会发生在
private class HostingCell<Content: View>: UITableViewCell {
    var host: UIHostingController<Content>?

    func setup(with view: Content) {
        if host == nil {
            let controller = UIHostingController(rootView: view)
            host = controller

            guard let content = controller.view else { return }
            content.translatesAutoresizingMaskIntoConstraints = false
            contentView.addSubview(content)

            content.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
            content.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
            content.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
            content.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
        } else {
            host?.rootView = view
        }
        setNeedsLayout()
    }
}
private struct ClassView: View {
    let store = Store<ClassState, ClassAction>(
        initialState: ClassState(),
        reducer: classReducer,
        environment: ClassEnv()
    )

    var body: some View {
        WithViewStore(store) { viewStore in
            CoreInterface.List(store.scope(state: \.people, action: ClassAction.personAction)) { store in
                PersonView(store: store)
            }
            .actionProvider { indices in
                let delete = UIAction(title: "Delete", image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
                    viewStore.send(.remove(indices))
                }

                return UIMenu(title: "", children: [delete])
            }
            .previewProvider { viewStore in
                Text("preview")
            }
        }
    }
}