在 swiftUI 中点击列表条目时呈现全屏视图
Posted
技术标签:
【中文标题】在 swiftUI 中点击列表条目时呈现全屏视图【英文标题】:Present full screen view on tap on list entry in swiftUI 【发布时间】:2021-07-22 18:43:13 【问题描述】:我正在尝试完成我认为相对简单的事情,即当您点击列表中的项目时让视图全屏显示。 此处显示的代码或多或少有效。但是,我必须准确地点击文本。点击空闲区域不会触发 onTap 事件。
示例代码:
struct ItemListView: View
var items: [Item]
var titel: String
@State private var selectedItem: Item?
var body: some View
List(items) item in
ItemListCell(item: item)
.onTapGesture
selectedItem = item
.navigationBarTitle(titel)
.fullScreenCover(item: $selectedItem, onDismiss: nil) item in
ItemDetailView(item: item)
struct ItemListCell: View
var item: Item
var body: some View
Text(String(item.id))
Text(item.name)
struct ItemDetailView: View
@Environment(\.presentationMode) var presentationMode
var item: Item
var body: some View
Text(String(item.id))
Text(item.name)
Button
presentationMode.wrappedValue.dismiss()
label:
Label("Close", systemImage: "xmark.circle")
我还查看了文档中的“支持列表中的选择”一章,但这仅在列表处于编辑模式时有效。
是否有与 UIKit 的 tableView(_:didSelectRowAt:)
等效的 swiftUI?
【问题讨论】:
【参考方案1】:确保内容的框架占据了整个单元格。我在下面的示例中使用.frame(maxWidth: .infinity, alignment: .leading)
执行此操作。
然后,添加一个 contentShape
修饰符,以便 SwiftUI 知道将整个形状视为内容 - 否则,它往往会忽略空格。
struct ItemListCell: View
var item: Item
var body: some View
VStack
Text(item.id)
Text(item.name)
.frame(maxWidth: .infinity, alignment: .leading)
.border(Color.green) //just for debugging to show the frame
.contentShape(Rectangle())
或者,如果您使用Button
而不是onTapGesture
,您基本上可以免费获得这一切:
List(items) item in
Button(action:
selectedItem = item
)
ItemListCell(item: item)
最后,不,没有 tableView(_:didSelectRowAt:)
的直接等效项
【讨论】:
用按钮提示解决方案。然后文本以强调色显示。 您可以使用.foregroundColor(.primary)
更改按钮中文本的颜色,或者在受影响的平台上使用.buttonStyle(PlainButtonStyle())
。以上是关于在 swiftUI 中点击列表条目时呈现全屏视图的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SwiftUI 的详细信息视图(编辑项目视图)中删除核心数据条目?
如何在基于 SwiftUI 的 iOS 应用中呈现连续视图?
SwiftUI:如何在单击 ActionSheet 按钮时呈现新视图?
从公共 API 获取 JSON 以在 SwiftUI 的列表视图中呈现