【发布时间】:2020-12-16 02:11:53
【问题描述】:
我有一个带有 ForEach 循环的 ScrollView,每个循环都呈现一个视图。在视图中,我有以下 ActionItem 的 3 个渲染(一个显示工作表的按钮)。 工作表不显示在 ScrollView 中,但显示在 List 中。我通常会将 .sheet 附加到 ScrollView 层,但是,每个按钮呈现不同的视图似乎更适合嵌套它。
我怎样才能让它与 ScrollView 一起工作?我正在使用 Xcode 12
struct ActionItem<Content>: View where Content : View {
public var text: String
public var icon: String
public var content: Content
@State var isPresented = false
init(text: String, icon: String, @ViewBuilder content: () -> Content) {
self.text = text
self.icon = icon
self.content = content()
}
var body: some View {
Button (action: {
DispatchQueue.main.async {
withAnimation {
self.isPresented = true
}
}
}) {
HStack(spacing: 2) {
Image(systemName: icon).font(.system(size: 14, weight: .semibold))
Text(text).fontWeight(.semibold)
}.padding([.top, .bottom], Dimensions.spacing)
.padding([.leading, .trailing], Dimensions.spacingMedium)
}.foregroundColor(Color.gray).font(.subheadline).background(Color.grayWhiteTer)
.cornerRadius(Dimensions.spacing)
.sheet(isPresented: $isPresented) {
self.content
}
}
}
在视图中,我将渲染 ActionItem,例如 Text,如果视图被忽略并且 ActionItem 直接位于 ForEach 中,也会发生这种情况。同样的问题,工作表没有出现。
ActionItem(text: "", icon: "pencil") {
Text("ok")
}
列表如下所示
import SwiftUI
struct ItemsList: View {
@ObservedObject var itemModel: ItemModel
var body: some View {
VStack(alignment: .center, spacing: 0) {
ScrollView {
VStack {
ForEach(itemModel.items, id: \.self) { item in
ItemView(item: item)
}
}.frame(maxWidth: .infinity, maxHeight: .infinity)
}}
建议的回调更新
struct ActionItem<Content>: View where Content : View {
public var text: String
public var icon: String
public var content: () -> Content
@State var isPresented = false
init(text: String, icon: String, @ViewBuilder content: @escaping () -> Content) {
self.text = text
self.icon = icon
self.content = content
}
var body: some View {
Button (action: {
DispatchQueue.main.async {
withAnimation {
self.isPresented = true
}
}
}) {
HStack(spacing: 2) {
Image(systemName: icon).font(.system(size: 14, weight: .semibold))
Text(text).fontWeight(.semibold)
}.padding([.top, .bottom], Dimensions.spacing)
.padding([.leading, .trailing], Dimensions.spacingMedium)
}.foregroundColor(Color.gray).font(.subheadline).background(Color.grayWhiteTer)
.cornerRadius(Dimensions.spacing)
.sheet(isPresented: $isPresented) {
self.content()
}
}
}
【问题讨论】:
标签: ios swiftui scrollview