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")
}
}
}
}