当前位置:   article > 正文

[SwiftUI]页面跳转_swiftui 页面跳转

swiftui 页面跳转

1. NavigationLink

NavigationLink 是用于在具有导航能力的视图之间进行页面跳转的主要方式,包裹在 NavigationLink 中的视图都是目的地视图的预览。当用户点击这个预览时,应用会将用户导航到目的地视图。使用 NavigationLink 时,确保你在 NavigationView 中使用它,否则导航将不会发生。

基本使用

最基本的 NavigationLink 用法是在 NavigationView 中直接创建一个链接到目标视图的链接。

  1. import SwiftUI
  2. struct ContentView: View {
  3. var body: some View {
  4. NavigationView {
  5. List {
  6. NavigationLink("Go to Detail View", destination: DetailView())
  7. }
  8. .navigationTitle("Home")
  9. }
  10. }
  11. }
  12. struct DetailView: View {
  13. var body: some View {
  14. Text("Detail View")
  15. }
  16. }

 

动态列表中使用

在动态列表中,为每个列表项创建一个 NavigationLink

  1. import SwiftUI
  2. struct ContentView: View {
  3. let items = ["Item 1", "Item 2", "Item 3"]
  4. var body: some View {
  5. NavigationView {
  6. List(items, id: \.self) { item in
  7. NavigationLink(item, destination: DetailView(item: item))
  8. }
  9. .navigationTitle("Items")
  10. }
  11. }
  12. }
  13. struct DetailView: View {
  14. let item: String
  15. var body: some View {
  16. Text("\(item) Detail View")
  17. }
  18. }

 

使用 @State 触发导航

可以使用 @State 变量和 isActive 参数来控制 NavigationLink 的激活状态

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var isLinkActive = false
  4. var body: some View {
  5. NavigationView {
  6. VStack {
  7. NavigationLink(
  8. destination: DetailView(),
  9. isActive: $isLinkActive
  10. ) {
  11. EmptyView()
  12. }
  13. Button("Tap to show details") {
  14. isLinkActive = true
  15. }
  16. }
  17. .navigationTitle("Home")
  18. }
  19. }
  20. }
  21. struct DetailView: View {
  22. var body: some View {
  23. Text("Detail View")
  24. }
  25. }

 

使用 NavigationLink 的 Label

NavigationLink 的构造器允许你定制触发链接的 UI 部分,这就是 Label。

  1. import SwiftUI
  2. struct ContentView: View {
  3. var body: some View {
  4. NavigationView {
  5. List {
  6. NavigationLink(destination: DetailView()) {
  7. HStack {
  8. Image(systemName: "star.fill")
  9. .foregroundColor(.yellow)
  10. Text("Go to Detail View")
  11. }
  12. }
  13. }
  14. .navigationTitle("Home")
  15. }
  16. }
  17. }
  18. struct DetailView: View {
  19. var body: some View {
  20. Text("Detail View")
  21. }
  22. }

 

使用 NavigationLink 在 ForEach 中

在 ForEach 结构中使用 NavigationLink 可以为集合中的每个元素创建导航链接。

  1. import SwiftUI
  2. struct ContentView: View {
  3. let data = ["First", "Second", "Third"]
  4. var body: some View {
  5. NavigationView {
  6. List {
  7. ForEach(data, id: \.self) { item in
  8. NavigationLink(destination: Text("\(item) Detail View")) {
  9. Text(item)
  10. }
  11. }
  12. }
  13. .navigationTitle("List")
  14. }
  15. }
  16. }

 

自定义 NavigationLink 的外观

你可以通过修改 NavigationLink 的 Label 部分来自定义其外观。

  1. import SwiftUI
  2. struct ContentView: View {
  3. var body: some View {
  4. NavigationView {
  5. NavigationLink(destination: DetailView()) {
  6. CustomCell()
  7. }
  8. }
  9. }
  10. }
  11. struct CustomCell: View {
  12. var body: some View {
  13. HStack {
  14. Image(systemName: "person.fill")
  15. VStack(alignment: .leading) {
  16. Text("Title")
  17. .font(.headline)
  18. Text("Subtitle")
  19. .font(.subheadline)
  20. }
  21. }
  22. }
  23. }
  24. struct DetailView: View {
  25. var body: some View {
  26. Text("Detail View")
  27. }
  28. }

 

2. Sheet

Sheet 通常用于显示临时内容,如表单、详情或辅助选项。它不同于 NavigationLink,后者用于在导航层次结构中推送新的视图。 Sheet 更适用于不需要保持导航历史的情况。

基本的 Sheet 使用

使用 .sheet 修饰符来展示一个模态视图,当某个布尔值为 true 时显示。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingSheet = false
  4. var body: some View {
  5. Button("Show Sheet") {
  6. showingSheet.toggle()
  7. }
  8. .sheet(isPresented: $showingSheet) {
  9. SheetView()
  10. }
  11. }
  12. }
  13. struct SheetView: View {
  14. var body: some View {
  15. Text("Sheet View")
  16. }
  17. }

使用 onDismiss 处理 Sheet 关闭

可以提供一个 onDismiss 的闭包来处理 Sheet 被关闭时的事件。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingSheet = false
  4. var body: some View {
  5. Button("Show Sheet") {
  6. showingSheet.toggle()
  7. }
  8. .sheet(isPresented: $showingSheet, onDismiss: {
  9. print("Sheet was dismissed.")
  10. }) {
  11. SheetView()
  12. }
  13. }
  14. }
  15. struct SheetView: View {
  16. var body: some View {
  17. Text("Sheet View")
  18. }
  19. }

使用 item 展示 Sheet

当你需要根据某个可选的数据项展示 Sheet 时,可以使用 item 参数。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var selectedItem: String?
  4. var body: some View {
  5. Button("Show Sheet with Item") {
  6. selectedItem = "Detail"
  7. }
  8. .sheet(item: $selectedItem) { item in
  9. DetailView(item: item)
  10. }
  11. }
  12. }
  13. struct DetailView: View {
  14. let item: String
  15. var body: some View {
  16. Text("\(item) View")
  17. }
  18. }

使用 sheet 结合列表

在列表中为每个条目展示不同的 Sheet。

  1. import SwiftUI
  2. struct ContentView: View {
  3. let items = ["Item 1", "Item 2", "Item 3"]
  4. @State private var selectedItem: String?
  5. var body: some View {
  6. NavigationView {
  7. List {
  8. ForEach(items, id: \.self) { item in
  9. Button(action: {
  10. selectedItem = item
  11. }) {
  12. Text(item)
  13. }
  14. }
  15. }
  16. .sheet(item: $selectedItem) { item in
  17. DetailView(item: item)
  18. }
  19. }
  20. }
  21. }
  22. struct DetailView: View {
  23. let item: String
  24. var body: some View {
  25. Text("\(item) Detail View")
  26. }
  27. }

使用 sheet 结合自定义触发器

你可以创建一个自定义的触发器,例如一个自定义的视图,当点击时,展示 Sheet。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingSheet = false
  4. var body: some View {
  5. CustomButton(showingSheet: $showingSheet)
  6. .sheet(isPresented: $showingSheet) {
  7. SheetView()
  8. }
  9. }
  10. }
  11. struct CustomButton: View {
  12. @Binding var showingSheet: Bool
  13. var body: some View {
  14. Button(action: {
  15. showingSheet = true
  16. }) {
  17. Text("Show Custom Sheet")
  18. }
  19. }
  20. }
  21. struct SheetView: View {
  22. var body: some View {
  23. Text("Custom Sheet View")
  24. }
  25. }

3. FullScreenCover

fullScreenCover 是用来覆盖全屏显示内容的,类似于 sheet,但是它会占据整个屏幕。

基本的 fullScreenCover 使用

使用 .fullScreenCover 修饰符来展示一个全屏覆盖视图,它会在某个布尔值为 true 时显示。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingFullScreenCover = false
  4. var body: some View {
  5. Button("Show Full Screen Cover") {
  6. showingFullScreenCover.toggle()
  7. }
  8. .fullScreenCover(isPresented: $showingFullScreenCover) {
  9. FullScreenCoverView()
  10. }
  11. }
  12. }
  13. struct FullScreenCoverView: View {
  14. var body: some View {
  15. Text("Full Screen Cover View")
  16. .frame(maxWidth: .infinity, maxHeight: .infinity)
  17. .background(Color.blue)
  18. }
  19. }

使用 onDismiss 处理全屏覆盖关闭

可以提供一个 onDismiss 的闭包来处理全屏覆盖被关闭时的事件。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingFullScreenCover = false
  4. var body: some View {
  5. Button("Show Full Screen Cover") {
  6. showingFullScreenCover.toggle()
  7. }
  8. .fullScreenCover(isPresented: $showingFullScreenCover, onDismiss: {
  9. print("Full Screen Cover was dismissed.")
  10. }) {
  11. FullScreenCoverView()
  12. }
  13. }
  14. }
  15. struct FullScreenCoverView: View {
  16. var body: some View {
  17. Text("Full Screen Cover View")
  18. .frame(maxWidth: .infinity, maxHeight: .infinity)
  19. .background(Color.green)
  20. }
  21. }

使用 fullScreenCover 和 item

当你需要根据某个可选的数据项展示全屏覆盖时,可以使用 item 参数。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var selectedItem: String?
  4. var body: some View {
  5. Button("Show Full Screen Cover with Item") {
  6. selectedItem = "Detail"
  7. }
  8. .fullScreenCover(item: $selectedItem) { item in
  9. FullScreenDetailView(item: item)
  10. }
  11. }
  12. }
  13. struct FullScreenDetailView: View {
  14. let item: String
  15. var body: some View {
  16. VStack {
  17. Text("\(item) Full Screen Detail View")
  18. Button("Dismiss") {
  19. // Normally you would use an environment variable to dismiss
  20. }
  21. }
  22. .frame(maxWidth: .infinity, maxHeight: .infinity)
  23. .background(Color.red)
  24. }
  25. }

使用 fullScreenCover 结合环境变量

你可以使用环境变量 presentationMode 来关闭全屏覆盖。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingFullScreenCover = false
  4. var body: some View {
  5. Button("Show Full Screen Cover") {
  6. showingFullScreenCover.toggle()
  7. }
  8. .fullScreenCover(isPresented: $showingFullScreenCover) {
  9. FullScreenCoverViewWithDismiss()
  10. }
  11. }
  12. }
  13. struct FullScreenCoverViewWithDismiss: View {
  14. @Environment(\.presentationMode) var presentationMode
  15. var body: some View {
  16. Button("Tap to dismiss") {
  17. presentationMode.wrappedValue.dismiss()
  18. }
  19. .frame(maxWidth: .infinity, maxHeight: .infinity)
  20. .background(Color.purple)
  21. }
  22. }

自定义触发 fullScreenCover 的按钮

可以创建一个自定义的按钮视图,当点击时,展示全屏覆盖。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingFullScreenCover = false
  4. var body: some View {
  5. CustomFullScreenCoverButton(showingFullScreenCover: $showingFullScreenCover)
  6. .fullScreenCover(isPresented: $showingFullScreenCover) {
  7. FullScreenCoverViewWithDismiss()
  8. }
  9. }
  10. }
  11. struct CustomFullScreenCoverButton: View {
  12. @Binding var showingFullScreenCover: Bool
  13. var body: some View {
  14. Button(action: {
  15. showingFullScreenCover = true
  16. }) {
  17. Text("Show Custom Full Screen Cover")
  18. }
  19. }
  20. }
  21. struct FullScreenCoverViewWithDismiss: View {
  22. @Environment(\.presentationMode) var presentationMode
  23. var body: some View {
  24. Button("Tap to dismiss") {
  25. presentationMode.wrappedValue.dismiss()
  26. }
  27. .frame(maxWidth: .infinity, maxHeight: .infinity)
  28. .background(Color.orange)
  29. }
  30. }

4. Programmatic Navigation

程序化导航(Programmatic Navigation)指的是通过代码控制页面跳转,而不是使用用户界面元素(如按钮)的默认行为。这种方式在某些情况下非常有用,比如在后台任务完成后自动跳转页面,或者基于复杂的逻辑条件来导航。

要在 SwiftUI 中实现程序化导航,通常会用到 NavigationLink 结合一个绑定的布尔值,或者使用 NavigationLink 的 isActive 参数。

使用 NavigationLink 和布尔值

下面这个例子中,NavigationLink 被隐藏了,因为我们不需要显示它的视图。当 navigate 变为 true 时,会触发导航到 DetailView

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var navigate = false
  4. var body: some View {
  5. NavigationView {
  6. VStack {
  7. Button("Navigate") {
  8. navigate = true
  9. }
  10. // 隐藏的 NavigationLink
  11. NavigationLink(destination: DetailView(), isActive: $navigate) {
  12. EmptyView()
  13. }
  14. }
  15. }
  16. }
  17. }
  18. struct DetailView: View {
  19. var body: some View {
  20. Text("Detail View")
  21. }
  22. }

使用 NavigationLink 的 tag 和 selection 参数

如果有多个导航目标,你可以使用 tag 和 selection 来区分不同的导航路径。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var selection: String?
  4. var body: some View {
  5. NavigationView {
  6. VStack {
  7. Button("Navigate to Detail 1") {
  8. selection = "Detail1"
  9. }
  10. Button("Navigate to Detail 2") {
  11. selection = "Detail2"
  12. }
  13. NavigationLink(destination: DetailView1(), tag: "Detail1", selection: $selection) { EmptyView() }
  14. NavigationLink(destination: DetailView2(), tag: "Detail2", selection: $selection) { EmptyView() }
  15. }
  16. }
  17. }
  18. }
  19. struct DetailView1: View {
  20. var body: some View {
  21. Text("Detail View 1")
  22. }
  23. }
  24. struct DetailView2: View {
  25. var body: some View {
  26. Text("Detail View 2")
  27. }
  28. }

使用 .onAppear 触发程序化导航

有时候,你可能希望在视图出现时自动触发导航,比如根据某个状态或者数据加载完成后。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var autoNavigate = false
  4. var body: some View {
  5. NavigationView {
  6. VStack {
  7. NavigationLink(destination: DetailView(), isActive: $autoNavigate) {
  8. EmptyView()
  9. }
  10. .isDetailLink(false)
  11. .onAppear {
  12. // 假设这里有一些逻辑判断或者异步操作完成后
  13. DispatchQueue.main.asyncAfter(deadline: .now() + 2) { // 延迟2秒
  14. autoNavigate = true
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. struct DetailView: View {
  22. var body: some View {
  23. Text("Detail View")
  24. }
  25. }

 

使用 NavigationLink 无界面跳转

有时候,你可能希望隐藏 NavigationLink,让导航完全由代码控制。你可以将 NavigationLink 放在 EmptyView 中,然后使用状态变量控制导航。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var isLinkActive = false
  4. var body: some View {
  5. NavigationView {
  6. VStack {
  7. Button("Navigate Programmatically") {
  8. isLinkActive = true
  9. }
  10. // 隐藏的 NavigationLink
  11. NavigationLink("", destination: DetailView(), isActive: $isLinkActive)
  12. }
  13. }
  14. }
  15. }
  16. struct DetailView: View {
  17. var body: some View {
  18. Text("Detail View")
  19. }
  20. }

使用 NavigationPath 和 NavigationStack

在最新版本的 SwiftUI 中,NavigationPath 和 NavigationStack 提供了更灵活的导航方式。你可以通过直接操作路径来进行导航。

下面这个例子中,点击按钮将 DetailView 添加到 navigationPath 中,这将触发导航到 DetailView

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var navigationPath = NavigationPath()
  4. var body: some View {
  5. NavigationStack(path: $navigationPath) {
  6. Button("Navigate Programmatically") {
  7. navigationPath.append(DetailView())
  8. }
  9. .navigationDestination(for: DetailView.self) { detailView in
  10. detailView
  11. }
  12. }
  13. }
  14. }
  15. struct DetailView: View {
  16. var body: some View {
  17. Text("Detail View")
  18. }
  19. }

5. TabView

TabView 可以用来创建一个包含多个子视图的标签页界面,每个子视图都与一个标签关联。用户可以通过点击不同的标签来切换不同的视图。

静态标签页

在最基本的情况下,TabView 中的每个标签和视图是静态定义的,通过直接嵌套视图来创建。

  1. import SwiftUI
  2. struct ContentView: View {
  3. var body: some View {
  4. TabView {
  5. Text("首页")
  6. .tabItem {
  7. Image(systemName: "house.fill")
  8. Text("首页")
  9. }
  10. Text("设置")
  11. .tabItem {
  12. Image(systemName: "gear")
  13. Text("设置")
  14. }
  15. }
  16. }
  17. }

动态标签页

TabView 也可以根据数据动态生成标签页。使用 ForEach 结构来循环创建多个标签。

  1. import SwiftUI
  2. struct ContentView: View {
  3. private var tabs = ["首页", "设置", "个人"]
  4. var body: some View {
  5. TabView {
  6. ForEach(tabs, id: \.self) { tab in
  7. Text(tab)
  8. .tabItem {
  9. Image(systemName: "\(tab).fill")
  10. Text(tab)
  11. }
  12. }
  13. }
  14. }
  15. }

使用 @State 控制当前选中的标签

你可以通过绑定一个 @State 变量到 TabView 的 selection 参数来控制当前选中的标签。

下面例子中,使用 .tag 标记每个视图,selectedTab 变量的值与标签的标记相对应,通过改变 selectedTab 的值来改变当前选中的标签。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var selectedTab = "首页"
  4. var body: some View {
  5. TabView(selection: $selectedTab) {
  6. Text("首页")
  7. .tabItem {
  8. Image(systemName: "house.fill")
  9. Text("首页")
  10. }
  11. .tag("首页") // 每个页面需要一个唯一的 tag
  12. Text("设置")
  13. .tabItem {
  14. Image(systemName: "gear")
  15. Text("设置")
  16. }
  17. .tag("设置") // 每个页面需要一个唯一的 tag
  18. }
  19. }
  20. }

程序化地切换标签

在某些情况下,你可能希望能够编程方式切换当前的标签页,比如响应某个事件。你可以通过修改绑定到 TabView 的 selection 属性的变量来实现。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var selectedTab = "首页"
  4. var body: some View {
  5. VStack {
  6. Button("切换到设置") {
  7. selectedTab = "设置"
  8. }
  9. TabView(selection: $selectedTab) {
  10. Text("首页")
  11. .tabItem {
  12. Image(systemName: "house.fill")
  13. Text("首页")
  14. }
  15. .tag("首页")
  16. Text("设置")
  17. .tabItem {
  18. Image(systemName: "gear")
  19. Text("设置")
  20. }
  21. .tag("设置")
  22. }
  23. }
  24. }
  25. }

自定义 TabView 样式

自定义 TabView 的样式,比如修改标签栏的背景色、字体颜色等。

通过直接访问 UITabBar 的 appearance 方法来改变标签栏的背景色。这种方法适用于更改全局的样式,但需要注意这种更改影响到整个 app 的 TabView 样式。

  1. import SwiftUI
  2. struct ContentView: View {
  3. init() {
  4. // 自定义 TabBar 的样式
  5. UITabBar.appearance().backgroundColor = UIColor.systemGray6
  6. }
  7. var body: some View {
  8. TabView {
  9. Text("首页")
  10. .tabItem {
  11. Image(systemName: "house.fill")
  12. Text("首页")
  13. }
  14. Text("设置")
  15. .tabItem {
  16. Image(systemName: "gear")
  17. Text("设置")
  18. }
  19. }
  20. // 更多自定义样式可以在这里设置
  21. }
  22. }

6. Pop-ups with Popover

Popover 是一种弹出视图,当用户与某个视图交互时,它可以从该视图或按钮弹出提供额外信息或选项。Popover 在 iPad 上以弹出框的形式显示,在 iPhone 上则通常全屏显示。

要在 SwiftUI 中使用 Popover,你需要绑定一个布尔值来控制 Popover 的显示和隐藏。

基础 Popover

这里展示一个简单的 Popover 示例,当点击一个按钮时,它会显示一个弹出视图。

  1. import SwiftUI
  2. struct ContentView: View {
  3. // 用于控制 Popover 是否显示
  4. @State private var showingPopover = false
  5. var body: some View {
  6. Button("显示 Popover") {
  7. self.showingPopover = true
  8. }
  9. .popover(isPresented: $showingPopover) {
  10. // 这里是 Popover 的内容
  11. Text("这是一个 Popover")
  12. .font(.headline)
  13. .padding()
  14. }
  15. }
  16. }

带有自定义视图的 Popover

你可以定义一个自定义视图,并在 Popover 中显示它。

  1. import SwiftUI
  2. struct PopoverContentView: View {
  3. var body: some View {
  4. VStack {
  5. Text("这是自定义内容")
  6. Button("关闭") {
  7. // 这里需要一个方法来关闭 Popover
  8. }
  9. }
  10. .padding()
  11. }
  12. }
  13. struct ContentView: View {
  14. @State private var showingPopover = false
  15. var body: some View {
  16. Button("显示 Popover") {
  17. self.showingPopover = true
  18. }
  19. .popover(isPresented: $showingPopover) {
  20. PopoverContentView()
  21. }
  22. }
  23. }

使用 Popover 完成页面跳转

在某些情况下,你可能想在 Popover 中放置一个导航链接,允许用户导航到另一个视图。

  1. import SwiftUI
  2. struct DetailView: View {
  3. var body: some View {
  4. Text("详细视图内容")
  5. }
  6. }
  7. struct ContentView: View {
  8. @State private var showingPopover = false
  9. var body: some View {
  10. NavigationView {
  11. Button("点击显示 Popover") {
  12. self.showingPopover.toggle()
  13. }
  14. .popover(isPresented: $showingPopover) {
  15. NavigationLink(destination: DetailView()) {
  16. Text("前往详细视图")
  17. }
  18. .padding()
  19. }
  20. }
  21. }
  22. }

带有关闭按钮的 Popover

通常,你可能希望在 Popover 内部提供一个关闭按钮,下面的示例展示了如何实现:

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingPopover = false
  4. var body: some View {
  5. Button("显示 Popover") {
  6. self.showingPopover = true
  7. }
  8. .popover(isPresented: $showingPopover) {
  9. VStack {
  10. Text("带关闭按钮的 Popover")
  11. Button("关闭") {
  12. self.showingPopover = false
  13. }
  14. .padding()
  15. }
  16. }
  17. }
  18. }

使用 sheet 和 popover 进行适配

在 iPad 和 iPhone 设备上,你可能想要根据不同的屏幕大小来适配 Popover 或 Sheet 的显示。可以使用 .popover 和 .sheet 的组合来实现。

针对不同的设备和屏幕尺寸适配 Popover 和 Sheet 的展示方式,我们通常需要依据环境变量 horizontalSizeClass 来决定使用哪一种。为了简化示例,我将提供一个针对 horizontalSizeClass 进行条件判断的代码示例,在 .regular 大小类时使用 Popover,而在 .compact 大小类时使用 Sheet

  1. import SwiftUI
  2. struct DetailView: View {
  3. var body: some View {
  4. Text("详细视图内容")
  5. .font(.title)
  6. }
  7. }
  8. struct ContentView: View {
  9. @State private var showDetails = false
  10. @Environment(\.horizontalSizeClass) var sizeClass
  11. var body: some View {
  12. Button("显示详情") {
  13. self.showDetails = true
  14. }
  15. .sheet(isPresented: $showDetails, onDismiss: {
  16. self.showDetails = false
  17. }) {
  18. // 在 compact size class 下显示 Sheet
  19. if sizeClass == .compact {
  20. DetailView()
  21. }
  22. }
  23. .popover(isPresented: $showDetails) {
  24. // 在 regular size class 下显示 Popover
  25. if sizeClass == .regular {
  26. DetailView()
  27. }
  28. }
  29. }
  30. }

条件 Popover

有时你可能需要根据特定条件来显示 Popover。你可以在 .popover 修饰符中使用条件语句来实现这一点。

  1. import SwiftUI
  2. struct ContentView: View {
  3. @State private var showingPopover = false
  4. @State private var condition = false
  5. var body: some View {
  6. Button("点击显示 Popover") {
  7. condition = true
  8. self.showingPopover.toggle()
  9. }
  10. .popover(isPresented: $showingPopover) {
  11. if condition {
  12. Text("条件为真时显示的视图")
  13. } else {
  14. Text("条件为假时显示的视图")
  15. }
  16. }
  17. }
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/780956
推荐阅读
相关标签
  

闽ICP备14008679号