问题标签 [swiftui-navigationlink]
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 - 使用导航链接推送时视图不更新
我面临一个问题,即视图不会使用 @Observable 对象自动更新。
所以,我想做的是我必须在 onAppear 中添加一个新人,而不是在点击按钮时添加一个新人。简而言之,可以说 people 数组已经有三个人,我必须在登陆该视图时添加第四个。
奇怪的是,如果此视图是根视图,则会添加该人,但是,当使用导航链接推送此视图时,它不起作用。在第二种情况下,立即添加和删除一个新人员,使人员数组计数为 3。
但是,只需轻按一下按钮,就可以轻松添加新人。我被困在这里几个小时。任何帮助将不胜感激!提前致谢!
编辑
我调试了更多以找出问题。因此,在 onAppear 中会自动在以下场景中添加新人:
1) 如果 ContentView 是应用程序的根视图。2) 如果 ContentView 是从父视图层次结构中的第一个视图推送的。意思是,如果有 ContentView 的子视图。子视图中的导航链接会产生此问题,但是,直接来自 ContentView 的导航链接会成功添加人员。
为了创建一个navigationLink,我使用了:
ios - SwiftUI - 如何避免将导航硬编码到视图中?
我尝试为更大的、生产就绪的 SwiftUI 应用程序构建架构。我一直在遇到同样的问题,这指向了 SwiftUI 中的一个主要设计缺陷。
仍然没有人能给我一个完整的工作、生产就绪的答案。
如何做SwiftUI
包含导航的可重用视图?
由于SwiftUI
NavigationLink
强烈地绑定到视图,这根本不可能以它在更大的应用程序中也可扩展的方式进行。NavigationLink
在那些小示例应用程序中,是的 - 但不是在您想在一个应用程序中重用多个视图时。也许还可以重用模块边界。(例如:在 iOS、WatchOS 等中重用 View……)
设计问题:NavigationLinks 被硬编码到视图中。
但是如果包含这个的视图NavigationLink
应该是可重用的,我就不能对目的地进行硬编码。必须有一种机制来提供目的地。我在这里问了这个并得到了很好的答案,但仍然不是完整的答案:
想法是将目标链接注入可重用视图。一般来说,这个想法是可行的,但不幸的是,这并不能扩展到真正的生产应用程序。一旦我有多个可重复使用的屏幕,我就会遇到一个逻辑问题,即一个可重复使用的视图 ( ViewA
) 需要一个预配置的视图目标 ( ViewB
)。但是如果ViewB
还需要一个预配置的 view-destinationViewC
怎么办?我需要ViewB
在ViewC
注入. _ 依此类推....但是由于当时必须传递的数据不可用,因此整个构造都失败了。ViewB
ViewB
ViewA
我的另一个想法是使用Environment
as 依赖注入机制为NavigationLink
. 但我认为这或多或少应该被视为一种 hack,而不是大型应用程序的可扩展解决方案。我们最终将基本上使用环境来处理所有事情。但是因为 Environment 也只能在 View 内部使用(不能在单独的 Coordinators 或 ViewModels 中使用),所以在我看来这会再次产生奇怪的结构。
就像业务逻辑(例如视图模型代码)和视图必须分开,导航和视图也必须分开(例如协调器模式)UIKit
这可能是因为我们访问UIViewController
并UINavigationController
在视图后面。UIKit's
MVC 已经存在一个问题,它混合了太多概念,以至于它变成了有趣的名称“Massive-View-Controller”而不是“Model-View-Controller”。现在类似的问题仍在继续,SwiftUI
但在我看来更糟。Navigation 和 Views 是强耦合的,不能解耦。因此,如果它们包含导航,就不可能做可重用的视图。有可能解决这个问题,UIKit
但现在我看不到一个理智的解决方案SwiftUI
. 不幸的是,Apple 没有向我们解释如何解决这样的架构问题。我们只得到了一些小的示例应用程序。
我很想被证明是错误的。请向我展示一个干净的应用程序设计模式,它可以为大型生产就绪应用程序解决这个问题。
提前致谢。
更新:这个赏金将在几分钟内结束,不幸的是仍然没有人能够提供一个有效的例子。但是,如果我找不到任何其他解决方案并将其链接到此处,我将开始一项新的赏金来解决这个问题。感谢大家的巨大贡献!
2020 年 6 月 18 日更新:我从 Apple 那里得到了关于这个问题的回答,提出了这样的建议来解耦视图和模型:
我的回应是:
感谢您的反馈。但是正如您所见,您仍然在视图中具有强耦合。现在“ContentView”需要知道它也可以导航的所有视图(ViewA、ViewB、ViewC)。正如我所说,这适用于小型示例应用程序,但不能扩展到大型生产就绪应用程序。
想象一下,我在 GitHub 的一个项目中创建了一个自定义视图。然后在我的应用程序中导入这个视图。这个自定义视图对它可以导航的其他视图一无所知,因为它们特定于我的应用程序。
我希望我能更好地解释这个问题。
我看到这个问题的唯一干净的解决方案是像在 UIKit 中那样分离导航和视图。(例如 UINavigationController)
谢谢,达科
所以仍然没有解决这个问题的干净和有效的解决方案。期待WWDC 2020。
2021 年 9 月更新:AnyView
对于这个问题,使用不是一个好的通用解决方案。在大型应用程序中,基本上所有视图都必须以可重用的方式设计。这意味着AnyView
get无处不在。我与两位 Apple 开发人员进行了一次会议,他们清楚地向我解释了AnyView
创建比 View 更差的性能,它应该只在特殊情况下使用。其根本原因是AnyView
在编译期间无法解析类型,因此必须在堆上分配。
swiftui - SwiftUI 详细视图显示在屏幕底部
我正在使用 SwiftUI 从列表的行创建 NavigationLinks 到 NavigationView 中的详细视图。在我的 CustomView 中,我有 2 个组:
- 第一个组包含应用程序徽标和搜索栏
- 第二个包含一个带有 NavigationLink 的列表(我用来显示搜索结果)
当我使用 NavigationLink 显示行的详细信息时,它可以工作,但我的 RetailerView() 显示在屏幕底部。
swift - 单击 NavigationLink、SwiftUI 时不会触发 .onDisappear() 方法
这就是我拥有的代码,正如标题中所写,单击 NavigationLink 不会触发 .onDisappear() 方法。相反,更改为另一个选项卡视图可以正常工作。我做错了什么还是这就是它应该工作的方式?在第二种情况下,是否有一种简单的方法可以在单击 NavigationLink 时执行一些代码?
firebase - 从 DetailView 更新 MainView 的 @ObservedObject 会强制从 DetailView 退出
我使用列表列表作为结构,在 MainView 中显示列表,并通过 NavigationLink 显示包含对象列表的每个列表的 DetailView。从 DetailView 我可以添加或删除这些对象,当我这样做时,我还更新了 Firebase 数据库。问题是观察到的对象是一个具有数据库侦听器的类,每次更新 Db 时,MainView 似乎都被重新创建,结果是 DetailView 回到 MainView。有没有办法阻止观察到的对象在 MainView 不在屏幕上时更新它,或者在单击 NavigationLink 时删除侦听器,以便在用户返回之前 MainView 不会更新?
ios - SwiftUI - 嵌套导航链接
我有一个看起来像这样的布局: 布局图
有一个主视图,它是我的 NavigationView 的提要,然后我在里面有视图: PostList -> Post -> PostFooter 和 PostFooter 一个按钮,这将是我的 NavigationLink
但是当我点击评论时,它会进入评论视图,然后返回 Feed(),然后返回 Comment(),然后返回 Feed(),并出现奇怪的行为。
有没有更好的方法来处理这种情况?
更新
Navigation 现在可以工作,但所有 Post 组件都是 Tapeable,而不仅仅是 PostFooter 中的 Text。有什么方法可以禁用单元格上的点击手势并在一个单元格中添加多个 NavigationLink 去不同的页面?
ios - iOS SwfitUI为列表而不是单元格设置背景图像
我试图给我的 ListView 一个不应该适用于每个单元格的背景图像。所以整个视图只有一张图像。我试图添加.background(Image("nameOfImage))
为列表修饰符,但没有做任何事情。
我也尝试过 ZStack 但我认为列表覆盖了我的图像
那么如何将图像作为列表背景或视图背景(上面的代码是整个视图)
swiftui - SwiftUI 列表未显示任何项目
我想将 NavigationView 与 ScrollView 一起使用,但我没有看到列表项。
我看到的只有文字。如果我删除 ScrollView 我会看到所有内容,但文本会被推到最底部。我只是希望能够在一个漂亮的可滚动页面中添加列表和视图。
swiftui - 将对象详细信息传递到另一个视图 [SwiftUI]
面对理解如何使用 NavigationLink 将对象详细信息移动到另一个视图的问题,我阅读了很多文章并观看了视频,除了 Preview 结构之外,它们都和我一样,它们使用本地数据并且很容易将视图映射到数据的第一项,如 data[0]。在我的情况下,我在线获取数据,因此上述方式并没有帮助我克服 Preview 结构的问题,错误:参数的参数丢失
文章已阅读:developer.apple.com/tutorials/swiftui/building-lists-and-navigation
www.raywenderlich.com/5824937-swiftui-tutorial-navigation
www.youtube.com/watch?v=BCSP_uh0co0&ab_channel=azamsharp
/// 主视图代码:
/// 详细查看代码:
/// 获取数据代码:
ios - 如何更改表单中的 NavigationLink 箭头颜色
在 SwiftUI 中,当 NavigationLink 放置在 Form 中时,一个箭头会自动出现在 NavigationLink 的尾部。如何更改此箭头的颜色?