我正在设计一个应用程序,其中包括检索 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) 我有一个关于内存管理如何在 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) 由于本问题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
我发现 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
我的主视图包含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
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 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
我找不到从 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) 我有一个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它会在顶部创建空白:
当我通过“设置”时,效果很好:
如何删除上面的空白?
我们正在推动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
swiftui ×9
swift ×4
apple-watch ×1
drag ×1
ios ×1
ios16 ×1
memory-leaks ×1
swiftui-list ×1
watchos-8 ×1