Xcode 11 Beta 5 - 模态触发器仅一次

Posted

技术标签:

【中文标题】Xcode 11 Beta 5 - 模态触发器仅一次【英文标题】:Xcode 11 Beta 5 - Modal triggers only once 【发布时间】:2019-07-30 19:39:44 【问题描述】:

我刚刚升级到 Xcode 11 Beta 5 并更新了我的 SwiftUI 项目。

在以前的版本中,我想使用 PresentationLink 组件来显示模式。我遇到了与现在相同的问题,模态仅显示一次。正如我在其他 SO 帖子中看到的那样,我认为这是一个错误。所以我尝试了升级到 Beta 5 的机会,但仍然没有成功。

我注意到这种行为似乎是由包装在 ScrollView 组件中引起的。如果我删除 ScrollView 组件,一切都会按预期正常工作。

代码如下:

struct HomeList : View 

    var listViewItems = listViewItemsData

    @State var show = false

    var body: some View 

        VStack 
            HStack 
                VStack(alignment: .leading) 
                    Text("Project title").font(.largeTitle).fontWeight(.heavy)
                    Text("Project subtitle").foregroundColor(Color.gray)
                
                Spacer()
            .padding(.top, 78).padding(.leading, 60)

            ScrollView(.horizontal, showsIndicators: false) 
                HStack(spacing: 30) 
                    ForEach(listViewItems)  item in
                        GeometryReader  geometry in
                            Button(action:  self.show.toggle()) 
                                ListView(title: item.title, image: item.image, color: item.color, destination: item.destination)
                                    .rotation3DEffect(Angle(degrees: Double((geometry.frame(in: .global).minX - 30) / -30)), axis: (x: 0, y: 10, z: 0))
                                    .sheet(isPresented: self.$show, content:  InformationView() )
                            
                        .frame(width: 246, height: 360)
                    
                .padding(30)
                Spacer()
            .frame(width: UIScreen.main.bounds.width, height: 480)
            Spacer()
        
    

总而言之,如果没有 ScrollView 包装器,Modal 行为将按预期工作。

我想知道是否有解决方案/解决方法?或者我只需要等待发布:)

从答案编辑

struct HomeList : View 

    var listViewItems = listViewItemsData

    @State var show = false
    @State var view: AnyView = AnyView(Text(""))

    var body: some View 
        VStack 
            HStack 
                VStack(alignment: .leading) 
                    Text("Project title").font(.largeTitle).fontWeight(.heavy)
                    Text("Project subtitle").foregroundColor(Color.gray)
                
                Spacer()
            .padding(.top, 78).padding(.leading, 60)

            ScrollView(.horizontal, showsIndicators: false) 
                HStack(spacing: 30) 
                    ForEach(listViewItems)  item in
                        GeometryReader  geometry in
                            Button(action: 
                                self.show.toggle()
                                self.view = item.destination
                            ) 
                                ListView(title: item.title, image: item.image, color: item.color, destination: item.destination)
                                    .rotation3DEffect(Angle(degrees: Double((geometry.frame(in: .global).minX - 30) / -30)), axis: (x: 0, y: 10, z: 0))
                            
                        .frame(width: 246, height: 360)
                    
                .padding(30)
                Spacer()
            .frame(width: UIScreen.main.bounds.width, height: 480)
                .sheet(isPresented: self.$show, content:  self.view )
            Spacer()
        
    

【问题讨论】:

【参考方案1】:

这和https://***.com/a/57087399/3179416是同一个问题

只需将您的 .sheet 移到您的 ForEach 之外。

import SwiftUI

struct Testing : View 

    var listViewItems: [Int] = [1, 2, 3]

        @State var show = false


        var body: some View 


            VStack 
                HStack 
                    VStack(alignment: .leading) 
                        Text("Project title").font(.largeTitle).fontWeight(.heavy)
                        Text("Project subtitle").foregroundColor(Color.gray)
                    
                    Spacer()
                .padding(.top, 78).padding(.leading, 60)

                ScrollView(.horizontal, showsIndicators: false) 
                    HStack(spacing: 30) 
                        ForEach(listViewItems, id: \.self)  item in
                            GeometryReader  geometry in
                                Button(action:  self.show.toggle()) 
                                    Text("Button")
                                        .rotation3DEffect(Angle(degrees: Double((geometry.frame(in: .global).minX - 30) / -30)), axis: (x: 0, y: 10, z: 0))
                                
                            .frame(width: 246, height: 360)
                        
                    .padding(30)
                    Spacer()
                .frame(width: UIScreen.main.bounds.width, height: 480)
                .sheet(isPresented: self.$show, content:  Text("Modal") )
                Spacer()
            
        

【讨论】:

感谢您的回答,Modal 的行为有效,但如果我的内容是动态的,我该怎么办? 然后传递更多状态。 @Hurobaki matt 是正确的。请参阅此答案的底部以获取简单示例***.com/questions/57063633/…

以上是关于Xcode 11 Beta 5 - 模态触发器仅一次的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode7 - beta 5 和 storyboard 中展开 segue

为啥我在 Xcode 11 Beta 5 中使用 ForEach 时会出错?

如何打开 .plist 文件作为源代码 xcode 11 beta 5

.send() 和 .sink() 似乎不再适用于 Xcode 11 Beta 5 中的 PassthroughSubject

如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI,Xcode 11 Beta 5)

无法在此文件中预览 - [App Name].app 可能已在 Xcode 11 Beta 5 上崩溃