问题标签 [ios-navigationview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 为什么当我的基础数据源更新时 SwiftUI 会自动向后导航,我该如何避免这种行为?
我有一个相当常见的设置:
- 使用
ForEach
组件创建的项目列表 - 当一个项目被点击时,我的应用导航到详细视图
- 在详细视图中,用户可以执行更改底层项目的更新
问题是更新底层项目(它是一个结构)会导致 SwiftUI 自动向后导航。我认为这是因为结构是一个不可变的值,并且在更新期间被销毁,但是,它确实符合,Identifiable
所以我希望 SwiftUI 能够理解该项目仍然存在并且只需要更新而不是销毁。
有没有办法在不离开详细视图的情况下更新基础列表?
这是一个最小的、可重现的示例。
xcode - 如何使用 SwiftUI 消除嵌套 NavigationView 中的空间
我目前正在使用 SwiftUI 为 iOS 开发一个项目。我有 3 页(MainMenu、CalendarList 和 DateDetails。)
在第二页 (CalenderList) 上,屏幕顶部和实际 NavigationBarTitle 之间有一个空白区域。
在第三页上,您可以看到返回按钮(到 MainMenu),顶部有两个空白区域。
我见过人们使用 .navigationBarHidden 来解决这个问题,但我无法以解决问题的方式实现它。
我是否错误地使用 NavigationView()?还是有什么特别的技巧?
这是 MainMenu 的代码:
这是 CalendarList 的代码(第 2 页):
这是 DateDetails 的代码(第 3 页):
ios - SwiftUI 通过推送通知在 NavigationView 中打开视图
我想在点击推送通知后打开一个视图。视图和通知都工作正常,但我的问题是当我尝试通过 .sheet(isPresented) 从推送通知打开视图时,它总是将视图呈现为模态。
我想实现视图实际上是在 NavigationView 中打开的,它通常是在手动访问它时。
为了更清楚:
点击推送通知后,我想直接跳转到 NavigationView 树中的 DetailView() (类似于点击通知时 Apple 日历应用程序正在执行的操作)。
有任何想法吗?
swift - 有没有办法从 SpriteView 场景中关闭 SwiftUI 视图?
我的场景是这样呈现的
在其他非 spriteKit 视图中,我曾经self.presentationMode.wrappedValue.dismiss()
导航回上一页。一旦从场景中触发游戏结束,在这种情况下我可以做类似的事情吗?(所有视图都在导航视图中)
swiftui - PresentationMode.dismiss 在 ForEach 中使用多个 NavigationLinks 时的奇怪行为
我的应用有 4 个视图(我们称它们为 View_A[root] -> View_B -> View_C -> View_D)。它们之间的导航是使用 NavigationView/NavigationLink 进行的。
当我从最后一个视图(View_D)调用self.presentationMode.wrappedValue.dismiss()时,我希望它只关闭当前视图(D),但由于某种原因,它关闭了所有视图并停在视图 A(根视图) .
这很奇怪。我花了几个小时试图弄清楚那里发生了什么,我发现 - 如果我从“View_A”中删除“ForEach”,它会正常工作,只有最后一个视图被忽略。即使 ForEach 在此示例中仅获得 1 个静态对象。
第二个奇怪的地方是
- 如果我不将“self.thisSession.stats”更改为 false,它也可以正常工作,只关闭最后一个视图。
这非常奇怪,因为 View_A (据我所知)不依赖于 thisSession 环境变量。
关于如何防止 View_C 和 View_B 在这种情况下被解雇的任何想法?单击链接后,我想最终到达View_C ,而不是View_A。
感谢您提供任何帮助,我花了一段时间才找到它的来源,但我不够聪明,无法继续进行;)
swiftui - Apple Watch 上的 SwiftUI NavigationView 在子视图中触发 onAppear 的多次调用
使用 Xcode Beta 12.3,以下代码将调用两次 onAppear 并打印两次。当我注释掉包装 ContentView 的 NavigationView 时,onAppear 只被调用一次。这是预期的行为吗?似乎任何 NavigationView 都会触发 onAppear 的多次调用,这不是我所期望的......我希望与 UIKit 中的 ViewWillAppear 具有相同的行为。
swiftui - SwiftUI 导航控制器卡顿,每个列表行有两个 Navigationlinks
我正在尝试在重复列表中创建两个 NavigationLink。每个都有一个单独的目的地。在我将对根视图的调用嵌入到 List/ForEach 循环之前,代码一切正常。此时导航变得非常奇怪。
尝试单击任一链接,然后单击顶部的后退指示器。它将转到一个 NavigationLink,然后转到另一个。有时以不同的顺序,有时它会从一个链接自动返回,有时它不会打开第二个详细视图,直到您从第一个详细视图返回。它在 Preview 中以及在您构建和运行应用程序时都执行此操作。
我已将代码提炼为以下最基本的代码。如果您按照 ContentView 中的说明注释 2 行,您将看到正确的行为。
我正在运行 Catalina 10.15.5、xCode 11.6,应用程序目标为 IOS 13.6。
如何修改代码,使其与 List/ForEach 循环一起使用?
ios - 在 SwiftUI 中使用视图模型而无需分配开销
在SwiftUI中使用视图模型
为了清晰地分离关注点,我想将我的SwiftUI视图与视图模型一起使用。
我有两个视图,一个ListView
是DetailView
当点击任何列表项时第一个会推动后者的视图——一个经典的导航视图。
我viewModel
在 my 上定义DetailView
如下属性并将其标记为观察对象,以便在其任何已发布属性发生更改时更新视图:
这种方法要求我在内部创建视图时将 a 传递viewModel
给's 初始化程序:DetailView
ListView
这里DetailViewModel
简单定义如下:
(这里的视图模型肯定是过度设计的,但这只是为了解释问题。)
⚡️ 问题
由于每次body
更新列表视图时都会创建所有导航链接的目标视图,因此相应的视图模型也是如此。对于如上所示的简单视图模型,这不是什么大问题,但对于更复杂的现实世界视图模型,它肯定会成为问题。例如,视图模型可能会实例化其他初始化起来相当昂贵的类。这将在显示ListView
每个DetailView
(模型)时完成——无论它是否会被显示(需要)。
因此,在我看来,在其他视图的主体内创建视图模型是一种反模式。尽管如此,这是我在 Internet 上的代码示例和文章中看到的最常见的做法。
❓ 我的问题
有没有办法让SwiftUI视图NavigationLink
立即实例化 s 的目标视图?或者有没有办法为视图创建视图模型以用作视图之外的导航链接目标body
?