SwiftUI List 在 Sheet 中的外观和行为与在 NavigationLink 中不同

Posted

技术标签:

【中文标题】SwiftUI List 在 Sheet 中的外观和行为与在 NavigationLink 中不同【英文标题】:SwiftUI List looks and behaves differently in Sheet than in NavigationLink 【发布时间】:2021-05-02 13:40:35 【问题描述】:

我创建了一个列表视图,其中包含供用户选择的部分(请参阅 LocationPickerModalView.swift),此列表可通过 NavigationLink 获得并按预期工作。然而,我决定将这个确切的视图移动到工作表(参见 ThrillEditView.swift),但这极大地改变了视图的外观和工作方式。 (参见下面的 Gif) 有没有办法使用工作表获得相同的行为?

// ThrillEditView.swift
public struct ThrillEditView: View 
  @State private var isLocationPickerSheetPresented: Bool = false

  public var body: some View 
    form 
      // ...
      NavigationLink("NavigationLink", destination: LocationPickerModalView())
      Button("Sheet (Via Button)") 
        self.isLocationPickerSheetPresented = true
      
      // ...
    
    .sheet(isPresented: self.$isLocationPickerSheetPresented, content: 
      LocationPickerModalView()
    )
  

// LocationPickerModalView.swift
public struct LocationPickerModalView: View 
  public var body: some View 
    List 
      Button("1")
      Button("2")
      Section(header: Text("one")) 
        Button("3")
        Button("4")
      
      Section(header: Text("two")) 
        Button("5")
        Button("6")
      
    
  

【问题讨论】:

它们对我来说看起来一样(Xcode 版本 12.5 (12E262)) 【参考方案1】:

.sheet 会创建新的视图层次结构,因此您需要在其中显式地添加 NavigationView,例如

.sheet(isPresented: self.$isLocationPickerSheetPresented, content: 
  NavigationView 
     LocationPickerModalView()
  
)

【讨论】:

这给出了相同的结果,除了将其包装在 NavigationView 中会在顶部添加 NavigationBar。

以上是关于SwiftUI List 在 Sheet 中的外观和行为与在 NavigationLink 中不同的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI中sheet弹出嵌在NavigationView中的子视图无法用presentationMode关闭(dismiss)弹出视图的解决

如何在 SwiftUI 中更改 modal 或 sheet 的大小?

SwiftUI List 重绘已呈现工作表的内容

iOS14中点击SwiftUI列表项导航跳转返回后外观呈灰色的解决

SwiftUI:为 .sheet(_: onDismiss:) 重置状态

SwiftUI .sheet() 的主体在解雇后被评估并且不呈现