标签: swiftui-navigationlink

点击 NavigationSplitView 上的不同按钮时如何避免重建视图

我尝试过苹果示例 为您的 SwiftUI 应用程序带来强大的导航结构

所以我的代码看起来像这样

        NavigationSplitView(
            columnVisibility: $navigationModel.columnVisibility
        ) {
            List(
                categories,
                selection: $navigationModel.selectedCategory
            ) { category in
                NavigationLink(category.localizedName, value: category)
            }
            .navigationTitle("Categories")
            .toolbar {
                ExperienceButton(isActive: $showExperiencePicker)
            }
        } detail: {
            NavigationStack(path: $navigationModel.recipePath) {
                RecipeGrid(category: navigationModel.selectedCategory)
            }
        }
Run Code Online (Sandbox Code Playgroud)

详情查看

struct RecipeGrid: View {
    var category: Category?
    var dataModel = DataModel.shared

    var body: some View {
        ZStack {
            if let category = category {
                ScrollView {
                    LazyVGrid(columns: columns) {
                        ForEach(dataModel.recipes(in: category)) { recipe in
                            NavigationLink(value: recipe) {
                                RecipeTile(recipe: recipe)
                            }
                            .buttonStyle(.plain) …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink swiftui-navigationsplitview swiftui-navigationstack

5
推荐指数
1
解决办法
454
查看次数

如何知道 SwiftUI 演示何时完成?

我想知道我的 SwiftUI 视图何时完成其转换/动画,以便安全地呈现其他视图/模式。

例子:

我在视图 A 中显示工作表 A。在工作表 AI 中,点击一个按钮可关闭工作表 A、从视图 A 转换到视图 B,并在视图 B 的顶部显示工作表 B。

一个幼稚的实现,例如用真实的绑定/状态初始化视图 B 以显示工作表 B,将导致以下形式的错误:

[Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x107a03a00> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x107821800> (from <_TtGC7SwiftUI19UIHostingControllerVVS_19BridgedPresentation8RootView_: 0x107a1a200>) while a presentation is in progress.
Run Code Online (Sandbox Code Playgroud)

这意味着我们需要等待视图 B 完成其转换,然后才能呈现工作表 B。

我知道我可以...

  • ...添加 aNavigationStack/View.sheet()从工作表 A 导航到工作表 B。但是,为了向用户提供上下文,我希望将视图 B 放在工作表 B 后面。
  • ...在显示工作表 B 之前等待几毫秒,因此可能确保视图 B 已完成转换。例如
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
      // trigger sheet
    }
    
    Run Code Online (Sandbox Code Playgroud)

等待秒钟对我来说似乎非常不确定,这就是为什么我想知道是否有一个更优雅的解决方案来解决这个问题。

swiftui swiftui-navigationlink swiftui-animation swiftui-navigationview

5
推荐指数
0
解决办法
230
查看次数

无法使用 NavigationView 和 NavigationLink 在 SwiftUI 中弹出当前屏幕

因此,我在尝试弹出当前屏幕时遇到了有关SwiftUI中的NavigationViewNavigationLinks的问题,这在本例中不起作用。

我有 3 个屏幕 A -> B -> C

每个屏幕都有一个用于弹出自身的按钮。

从 B -> A 的弹出有效,但是当您从 A -> B -> C 导航时,从 C -> B 的弹出不起作用。

你知道会出现什么问题吗?我将附上下面的代码和视频。该应用程序应支持iOS 14

在此输入图像描述

struct ScreenA: View {
    @State private var showB = false
    
    var body: some View {
        NavigationView {
            VStack {
                Button("Go to B") {
                    showB = true
                }
                
                NavigationLink(destination: ScreenB(didTapGoBack: {
                    showB = false
                }), isActive: $showB) {
                    EmptyView()
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct ScreenB: View …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-navigationlink

5
推荐指数
1
解决办法
298
查看次数

如何使用 SwiftUI 在警报中使用导航

我正在开发一个蓝牙应用程序。它有入门和仪表板。在入门上有关于如何使用模块的配对和说明,仪表板控制外围设备。所以我需要使用警报取消配对并将其导航到一个名为Onboarding的不同页面。如何使用警报导航到不同的视图。

代码块

import SwiftUI
import BLE

struct Dashboard: View {

    @EnvironmentObject var BLE: BLE
    @State private var showUnpairAlert: Bool = false
    @State private var hasConnected: Bool = false

    let defaults = UserDefaults.standard
    let defaultDeviceinformation = "01FFFFFFFFFF"

    struct Keys {
        static let deviceInformation = "deviceInformation"
    }

    var body: some View {
        VStack(alignment: .center, spacing: 0) {
            // MARK: - Menu Bar
            HStack(alignment: .center, spacing: 10) {
                VStack(alignment: .center, spacing: 4) {
                    Text(self.hasConnected ? "PodId \(checkForDeviceInformation())":"Pod is not connected")
                        .font(.footnote) …
Run Code Online (Sandbox Code Playgroud)

swift swiftui swift5.1 swiftui-navigationlink

4
推荐指数
1
解决办法
1972
查看次数

编辑模式下的 SwiftUI 列表行不允许按钮操作/导航链接工作?

我注意到,编辑模式下的 SwiftUI 列表行不允许按钮操作起作用(以及导航链接)。有没有办法让这个工作?

目标- 希望根据编辑模式对以下内容具有 NavigationLink 或 Modal 视图。这依赖于让按钮操作/导航链接在编辑模式下工作的能力。(如果有另一种方式来实现我的目标很高兴有指点)

  1. 非编辑模式:单击行 => 此记录的详细视图
  2. 在编辑模式下:单击行 => 主记录名称的编辑视图(例如重命名)

代码(只是为了突出显示按钮在编辑模式下不起作用):

   List() {
        ForEach(gcLists) { gcList in
            HStack {
                Button(gcList.title) {
                    print("button pressed!")
                }
            }
        }
        .onDelete(perform: deleteList)
        .onMove(perform: move)
    }
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-list swiftui-navigationlink

4
推荐指数
1
解决办法
585
查看次数

iOS SwfitUI 设置列表而不是单元格的背景图像

我试图为我的 ListView 提供一个背景图像,该图像不应适用于每个单元格。因此整个视图只需一张图像。我尝试添加.background(Image("nameOfImage))为列表修饰符但没有执行任何操作。

NavigationView {
    List(elements) { element in 
        NavigationLink(destination: NextView) {
            Text(element.name)
            Image(element.image)
        }
    }.background(Image("nameOfImage"))
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过 ZStack,但我认为该列表覆盖了我的图像

那么如何将图像作为列表背景或视图背景(上面的代码是整个视图)

ios swift swiftui swiftui-list swiftui-navigationlink

4
推荐指数
1
解决办法
2232
查看次数

如何更改表单中的 NavigationLink 箭头颜色

在 SwiftUI 中,当 NavigationLink 放置在 Form 内时,NavigationLink 的尾部会自动出现一个箭头。这个箭头的颜色怎么改?

struct example: View {
    var body: some View {
        NavigationView {
            Form {
                NavigationLink(destination: Text("Example destination")) {
                    Text("Example link")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

iphone ios swift swiftui swiftui-navigationlink

4
推荐指数
2
解决办法
1643
查看次数

SwiftUI NavigationLink 突出显示返回上一视图后保持突出显示

我对SwiftUI有一系列的看法。一种是“菜单视图”,它由包装在导航视图中的导航链接列表组成

代码如下。

var body: some View {
        NavigationView {
            List {
                HStack {
                    NavigationLink(destination: History(), isActive: $isHistoryViewActive) {
                    Image(systemName: "clock")                        
                    Text("History")                    
                    }
                }
                
                HStack {
                    NavigationLink(destination: Settings(), isActive: $isSettingsActive) {
                        Image(systemName: "gear")
                        Text("Settings")
                    }
                }
                
                HStack {
                    Image(systemName: "info.circle.fill")
                    Button(action: {
                        ...
                    }) {
                        Text("My Button")
                    }
                }
            }
        }
   }
Run Code Online (Sandbox Code Playgroud)

设置视图如下

var body: some View {
     List {
        ...
        Section(header: "Background Music") {
           Toggle("Play", isOn: $isBackGroundMusicOn)
        }
           
        Section(header: "Voice Setting") {
           HStack {
              NavigationLink(destination: …
Run Code Online (Sandbox Code Playgroud)

ios swiftui swiftui-list swiftui-navigationlink swiftui-navigationview

4
推荐指数
1
解决办法
605
查看次数

将具有自己参数的 SwiftUI 视图作为变量传递给另一个视图结构

我将尝试在这里概述我的案例,我想NavigationLink将其变成它自己的结构,以便我可以重新使用它。我使用的所有案例的内部都是相同的,只是文本和图像不同LabelNavigationLink我正在尝试使包含 的新结构NavigationLink具有我用于 的目标视图的参数NavigationLink

我发现这个链接帮了我大部分忙,但我似乎无法完成最后一英里。

如何将一个 SwiftUI View 作为变量传递给另一个 View 结构

这是我制作的可重用NavigationLink结构:

struct MainMenuButtonView<Content: View>: View {
    
    var imageName: String
    var title: String
    var description: String
    var content: Content
    
    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content()
    }
    
    var body: some View {
        VStack {
            NavigationLink(destination: content) {
                Image(imageName)
                    .resizable()
                    .frame(width: 100, height: 100)
                Text(title)
                    .font(.title)
                Text(description)
                    .foregroundColor(Color(UIColor.systemGray2))
                    .multilineTextAlignment(.center)
                    .font(.footnote)
                    .frame(width: 175)
            }
            .buttonStyle(PlainButtonStyle())
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-navigationlink

4
推荐指数
1
解决办法
1万
查看次数

@Environment(\.dismiss) bug 导致弹出视图在 iOS 15 中加载自身的新版本

导航到 INCR: 3 并点击导航栏后退按钮或关闭按钮,您会注意到再次调用相同的视图,但这次是新版本,因为 和onAppear firstLoad = truerand不同的值。

如果您注释掉@Environment(\.dismiss) var dismissdismiss()一切都会像 iOS 14 中那样按预期工作。此问题也会发生在@Environment(\.presentationMode) var presentationMode

不确定这是一个错误还是我犯了一个愚蠢的错误,但这个问题给我的应用程序带来了很多问题,因为我必须能够以编程方式关闭视图,因此任何输入都会受到赞赏。

struct DetailView: View {
    
    @Environment(\.dismiss) var dismiss
    
    @State var isPresenting = false
    
    @State var incrInt = 0
    
    @State var firstLoad = true
    
    @State var rand = Int.random(in: 1..<500)
    
    var body: some View {
        
        Text("INCR: \(incrInt) RAND: \(rand)")
        
        Button("NAVIGATE"){
            isPresenting = true
        }
        Button("DISMISS"){
           dismiss()
        }
        
        .onAppear(perform: {
            
            if firstLoad{
                print("ON APPEAR FIRST LOAD")
                print(incrInt) …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-navigationlink ios15

4
推荐指数
1
解决办法
1495
查看次数