标签: swiftui-navigationlink

尝试在 SwiftUI 中重新访问之前单击的 NavigationLink 时,NavigationLink 冻结

我正在设计一个应用程序,其中包括检索 JSON 数据和在 FileBrowser 类型视图中显示检索项目列表的功能。在此视图中,用户应该能够单击文件夹以深入了解文件树,或单击文件以查看有关该文件的一些元数据。

我观察到,在此过程中,当我单击一个文件或文件夹然后返回并再次单击它时,不会触发 NavigationLink,并且在单击不同的 NavigationLink 之前我一直停留在视图上。

这是演示此问题的 gif。

双击错误

如图所示,当我点击 BlahBlah 时,我正在激活 NavigationLink 并被带到 BlahBlah,然后当我返回并尝试重新导航到 BlahBlah 时,它变成灰色,表明我点击了它...... . 单击 TestFile 修复了这个问题,并允许我导航回 BlahBlah。

列表项由以下结构组成

private struct FileCell{
    var FileName: String
    var FileType: String
    var FileID: String = ""
    var isContainer: Bool
}

private struct constructedCell: View{

    var FileType: String
    var FileName: String
    var FileID: String

    var body: some View {
        return
            HStack{
                VStack(alignment: .center){
                    Image(systemName: getImage(FileType: FileType)).font(.title).frame(width: 50)
                }
                Divider()
                VStack(alignment: .leading){
                    Text(FileName).font(.headline)
                        .multilineTextAlignment(.leading)
                    Text(FileID)
                        .font(.caption)
                        .multilineTextAlignment(.leading)
                }
        } …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-list swiftui-navigationlink

10
推荐指数
1
解决办法
844
查看次数

SwiftUI NavigationLink 内存泄漏

我有一个关于内存管理如何在 SwiftUI 的 NavigationView 堆栈中工作的问题。我有一个视图,其中我已经声明了 NavigationView 和 NavigationLink,NavigationLink 的目标参数内部是我的 TestView。导航效果很好,但是当我从堆栈中弹出视图时(fe up back button)deinit 没有打印在控制台中,TestViewModel 仍然可以在内存图中找到。当不再需要它时,如何取消初始化我的 TestViewModel?

    /// First view in application
    struct ContentView: View {

        var body: some View {
            NavigationView {
                VStack {
                    Text("Hello, leak!")
                    NavigationLink(
                        destination: TestView(viewModel: TestViewModel()),
                        label: { Text("Create leak ???") }
                    )
                }
            }
        }
    }

    /// Just simple class for init and deinit print
    class TestViewModel: ObservableObject {

        @Published var text = "Test"

        init() {
            print("TestViewModel init")
        }

        deinit {
            print("TestViewModel deinit")
        }
    } …
Run Code Online (Sandbox Code Playgroud)

memory-leaks swiftui-navigationlink

10
推荐指数
2
解决办法
1413
查看次数

TabView 中的 SwiftUI 导航标题

由于本问题SwiftUI TabView 亮度视图垂直位置中概述的答案中概述的原因,我的应用程序的菜单结构是NavigationView-> TabView-> 具有不同导航标题的子视图。

问题是为.navigationTitle整个 TabView 提供一个导航标题,而不是为每个子视图提供一个导航标题。如何拥有多个导航标题TabView,每个子视图一个?

struct ContentView: View {
    var body: some View {
        NavigationView {
            TabView {
                Text("Hello")
                    .navigationTitle("Title One")
                    .tabItem {
                        Image(systemName: "square.stack")
                }
                Text("Hello Again")
                    .navigationTitle("Title Two")
                    .tabItem {
                        Image(systemName: "checkmark.square")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink swiftui-tabview swiftui-navigationview

10
推荐指数
1
解决办法
6925
查看次数

SwiftUI:NavigationLink 在 WatchOS 8.1RC 的 Tabview 中立即弹出

我发现 watchOS 8.1RC 中存在从 TabView 触发的 NavigationLink 的回归。马上就被驳回了。

它在 watchOS 8.0 或模拟器 (watchOS 8.0) 中运行。你知道解决方法吗?谢谢

示例代码:

import SwiftUI

@main
struct TestNavigationApp: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                ContentView()
            }
        }
    }
}

struct ContentView: View {
    var body: some View {
        List {
            NavigationLink(destination: ContentView1()) {
                Text("To TabView")
            }
        }
        
    }
}

struct ContentView1: View {
    var body: some View {
        TabView {
            NavigationView {
                NavigationLink(destination: ContentView2()) {
                    Text("To ContentView2")
                }
            }
            VStack {
                Text("Screen2") …
Run Code Online (Sandbox Code Playgroud)

apple-watch swiftui swiftui-navigationlink swiftui-tabview watchos-8

10
推荐指数
1
解决办法
971
查看次数

使用导航链接在视图之间导航时使用匹配几何效果

我的主视图包含CustomView,点击时可通过 来打开详细视图NavigationLink。详细视图还包含CustomView,只是位置不同。

CustomView我可以使用匹配几何效果在单击导航链接时对位置进行过渡/动画吗?

struct HomeView: View {
    @Namespace var namespace
    
    var body: some View {
        NavigationStack {
            VStack {
                Text("Top")
                NavigationLink {
                    DetailView(namespace: namespace)
                } label: {
                    CustomView()
                        .matchedGeometryEffect(id: "testId", in: namespace)
                }
                Text("Bottom")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
struct DetailView: View {
    var namespace: Namespace.ID
    
    var body: some View {
        VStack {
            CustomView()
                .matchedGeometryEffect(id: "testId", in: namespace)
            Text("Details")
            Spacer()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

swift swiftui swiftui-navigationlink swiftui-animation swiftui-transition

10
推荐指数
1
解决办法
686
查看次数

导航视图中的SwiftUI自定义动画过渡?

SwiftUI 中是否有一种方法可以更改 NavigationView/NavigationLink 的标准行为,即从一个视图滑动到下一个视图?我想要一个自定义动画/过渡,如淡入/淡出。

我现在尝试了一段时间并解决了一半,但在后半部分苦苦挣扎。这段代码:

struct ContentView: View {
    @State var appeared: Double = 0.0

    var body: some View {
        NavigationView {
            VStack {
                Text("\(appeared)")
                NavigationLink(destination: ViewB()) {Text("go to View B")}
            }
            .opacity(appeared)
            .animation(Animation.easeInOut(duration: 3.0), value: appeared)
            .onAppear {self.appeared = 1.0}
            .onDisappear {self.appeared = 0.0}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

视图出现时工作正常。它通过在 3 秒内将不透明度更改为 1.0 来淡入。都好。但是当单击NavigationLink, 转到视图 B 时,它会滑开此视图,并且视图 B(具有相同的逻辑)缓慢淡入。我想这是因为onDisappear实际上是在视图消失时触发,而不是在它即将离开时触发。

是否有机会告诉 SwiftUI 不要滑动或滑动,而是执行自定义动画/过渡?

我正在使用 Xcode 11.2.1

swiftui swiftui-navigationlink

9
推荐指数
1
解决办法
6641
查看次数

不完整的向后滑动手势导致 NavigationPath 管理不善

我正在下面的示例代码中寻找以下错误的解决方案。我尝试使用 SwiftUI 4 和 iOS 16.0 导航 API 变更集实现导航器模式。

下面的示例将在 Xcode 14.0+ 中编译,如果在模拟器或 iOS 16.0 设备中运行,将会产生我所描述的错误。我想知道这是缺乏知识还是平台错误。通过我的日志,我可以看到,当我用不完整的向后滑动手势引发错误时,导航路径的元素计数上升到 2,而实际上它应该在根处返回到 0,并且仅在第一层保留 1 个元素看法。

有没有办法可以更好地管理此类视图层次结构的路径?或者,这是一个平台级错误吗?

import SwiftUI

enum AppViews: Hashable {
    case kombuchaProductsView
    case coffeeProductsView
    case customerCartView
}

struct RootView: View {
    @StateObject var drinkProductViewModel = DrinkProductViewModel()
    
    var body: some View {
        NavigationStack(path: self.$drinkProductViewModel.navPath) {
            List {
                Section("Products") {
                    NavigationLink(value: AppViews.kombuchaProductsView) {
                        HStack {
                            Text("View all Kombuchas")
                            Spacer()
                            Image(systemName: "list.bullet")
                        }
                    }
                    NavigationLink(value: AppViews.coffeeProductsView) {
                        HStack {
                            Text("View all Coffees")
                            Spacer()
                            Image(systemName: "list.bullet")
                        } …
Run Code Online (Sandbox Code Playgroud)

drag swiftui swiftui-navigationlink ios16 swiftui-navigationstack

9
推荐指数
3
解决办法
1537
查看次数

如何在 SwiftUI 中放松到 MainView

我找不到从 ViewB 转到 ContentView 而不NavigationView在另一个NavigationView.

struct ContentView: View {
    var body: some View {
        NavigationView{
            VStack {
                Text("Go to ViewA")
                NavigationLink(destination: ViewA()) {Text("Go")}
            }.navigationBarTitle("ContentView")
        }
    }
}

struct ViewA: View {
   @Environment(\.presentationMode) var presentationMode
    var body: some View {
        VStack {
            Text("Go to ViewB")
            NavigationLink(destination: ViewB()) {Text("Go to B")}
            Text("Go back")
            Button(action: { self.presentationMode.wrappedValue.dismiss() }) {Text("Go to ContentView")}
        }.navigationBarTitle("ViewA")
    }
}

struct ViewB: View {
    @Environment(\.presentationMode) var presentationMode
    var body: some View {
        VStack {
            Text("Go …
Run Code Online (Sandbox Code Playgroud)

swiftui swiftui-navigationlink

8
推荐指数
1
解决办法
611
查看次数

SwiftUI NavigationView 删除空白

我有一个HomeView

NavigationView {
    ZStack {
        VStack {
             NavigationLink(destination: ProfileView()) {
                 if session.userInSession?.activated != 1 {
                     completionText(message: "Complete Your Profile")
                 } else {
                     completionText(message: "Edit Your Profile")
                 }
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的ProfileView没有包含在导航视图中,也没有栏标题:

VStack {
    ScrollView(showsIndicators: false) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但我的ProfileView也可以从我的访问SettingView

NavigationView {
    VStack(alignment: .leading) {
        List {
            NavigationLink(destination: ProfileView()) {
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我ProfileView从设置屏幕访问我的时,它显示正常。但是当我从我的访问它时,HomeView它会在顶部创建空白:

在此输入图像描述

当我通过“设置”时,效果很好:

在此输入图像描述

如何删除上面的空白?

swift swiftui swiftui-navigationlink swiftui-navigationview

8
推荐指数
1
解决办法
3787
查看次数

如何从 SwiftUI 推送到现有的 UINavigationController 堆栈?

我们正在推动SwiftUI嵌入在土地中的视图,UIHostingViewController如下UIKit所示:

首先制作UIViewController

    func hostingController() -> UIViewController {
    let swiftUIView = swiftUIView(viewModel: viewModel(data: [Data, Data, Data]))
    return UIHostingController(rootView: swiftUIView)
}
Run Code Online (Sandbox Code Playgroud)

然后将其压入UINavigationView堆栈:

[self.navigationController pushViewController:hostingViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

这让我们进入了SwiftUI环境。但是,如果我们的SwiftUI环境有自己的带有NavigationView和的导航堆栈NavigationLink,则原始navigationBar的后退按钮只能导航回原始呈现UIViewController

有没有办法将SwiftUI嵌入的视图推NavigationView送到现有UINavigationController堆栈上?

到目前为止,我们唯一的想法是UIHostingViewController为每个新SwiftUI屏幕创建一个新屏幕,并通过某种委托方法将其推送到堆栈上。

我们正在寻找的是这样的:

UINavigationStack: [UIViewController -> UIViewController -> SwiftUIView -> SwiftUIView]
Run Code Online (Sandbox Code Playgroud)

中的后退<箭头navigationBar将按预期运行。

如果我们可以进一步澄清,请告诉我们!

uinavigationcontroller swift swiftui swiftui-navigationlink swiftui-navigationview

8
推荐指数
1
解决办法
2291
查看次数