ScrollView中断.sheet表示形式

时间:2019-08-18 16:31:55

标签: swiftui

我正在尝试将工作表表示形式的工作嵌套在ScrollView内的多个视图中。

在没有ScrollView的情况下,.sheet修改器可以正常工作,但是当我将所有内容包装在滚动视图中时,该修改器仅触发一次。因此,在第一次点击时,工作表似乎正常,但是在将其关闭后无法再次触发它。我不确定这是SwiftUI本身的错误还是在这里做的事情。

注意:如果我将.sheet修饰符添加到ScrollView本身,则一切正常。但是对于我的用例,.sheet修饰符深深地嵌套在ScrollView内的自定义视图中。

我正在使用Xcode Beta 5

没有ScrollView-有效

struct SheetWorks: View {
    @State var showSheet = false

    var strings = [
      "Hello", "World", "!"
    ]

    var body: some View {
        HStack {
            ForEach(strings) { string in
                Button(action: {self.showSheet.toggle()}) {
                    Text(string)
                }
                .sheet(isPresented: self.$showSheet) {
                    Text("Here is the sheet")
                }
            }
        }
        .padding()
    }
}

使用ScrollView-不起作用

struct SheetDoesntWork: View {
    @State var showSheet = false

    var strings = [
      "Hello", "World", "!"
    ]

    var body: some View {
        ScrollView(.horizontal) {
            HStack {
                ForEach(strings) { string in
                    Button(action: {self.showSheet.toggle()}) {
                        Text(string)
                    }
                    .sheet(isPresented: self.$showSheet) {
                        Text("Here is the sheet")
                    }
                }
            }
            .padding()
        }
    }
}

也许有人经历过类似的事情,或者可以指出正确的方向。我非常感谢您的帮助。

修改:此问题在Beta 6中仍然存在

2 个答案:

答案 0 :(得分:2)

在这里查看我的答案:https://stackoverflow.com/a/57259687/554203

基本上,您应该只在循环外使用一个.sheet并根据本地变量动态打开所需的视图。

var covers = coverData
var selectedTag = 0

Group {
   ForEach(covers) { item in
      Button(action: { 
         self.selectedTag = item.tag
         self.isPresented.toggle() 
      }) {
        CoverAttributes(
           title: item.title,
           alternativeTitle: alternativeTitle,
           tapForMore: item.tapForMore,
           color: item.color,
           shadowColor: item.shadowColor)
      }
   }
}
.sheet(isPresented: self.$isPresented, content: { 
    Text("Destination View \(self.selectedTag)") 
    // Here you could use a switch statement on selectedTag if you want
})

答案 1 :(得分:0)

Xcode 11.1 GM Seed开始,我可以批准.sheet修饰符现在可以在ScrollView内正常工作。此外,现在也可以正确呈现多行Text