Questions tagged «swiftui-navigationlink»

6
SwiftUI-如何避免将导航硬编码到视图中?
我尝试为更大的,可投入生产的SwiftUI App做架构。我一直在遇到一个相同的问题,这表明SwiftUI的一个主要设计缺陷。 仍然没有人能给我完整的工作,生产就绪的答案。 如何在SwiftUI其中包含导航的可重用视图? 由于SwiftUI NavigationLink牢固地绑定在视图上,因此根本不可能在较大的Apps中进行缩放。NavigationLink是的,在这些小样本应用程序中可以工作-是的,但是当您要在一个应用程序中重用许多视图时就不会立即使用。并且可能还会在模块边界上重用。(例如:在iOS,WatchOS等中重用View) 设计问题:NavigationLinks硬编码到视图中。 NavigationLink(destination: MyCustomView(item: item)) 但是,如果包含此视图的视图NavigationLink应该可重用,则无法对目的地进行硬编码。必须有一种提供目的地的机制。我在这里问这个问题,得到了很好的答案,但仍然没有完整的答案: SwiftUI MVVM协调器/路由器/ NavigationLink 想法是将目标链接注入到可重用视图中。通常,此想法可行,但不幸的是,这并不适合实际的Production Apps。一旦有了多个可重复使用的屏幕,我就会遇到一个逻辑问题,即一个可重复使用的视图(ViewA)需要一个预先配置的视图目标(ViewB)。但是,如果ViewB还需要预配置的视图目标该ViewC怎么办?我需要建立ViewB在这样的方式已经ViewC被注入已经ViewB在我注入ViewB到ViewA。依此类推....但是由于当时必须传递的数据不可用,整个构造失败了。 我的另一个想法是使用Environmentas依赖项注入机制为注入目标NavigationLink。但是我认为,这或多或少应被视为一种骇客行为,而不是针对大型应用程序的可扩展解决方案。我们最终将基本上将环境用于所有内容。但是因为Environment也只能在View内部使用(不能在单独的Coordinators或ViewModels中使用),所以我认为这将再次创建奇怪的构造。 就像业务逻辑(例如,视图模型代码)和视图一样,导航和视图也必须分开(例如,协调器模式)。UIKit这是有可能的,因为我们可以访问视图UIViewController并UINavigationController在视图后方进行访问。UIKit'sMVC已经存在一个问题,即它混和了许多概念,因此变成了有趣的名称“ Massive-View-Controller”而不是“ Model-View-Controller”。现在,类似的问题仍在继续,SwiftUI但在我看来甚至更糟。导航和视图是紧密耦合的,不能分离。因此,如果包含导航,则无法进行可重用的视图。可以解决这个问题,UIKit但是现在我看不到一个理智的解决方案SwiftUI。不幸的是,Apple没有向我们提供如何解决类似架构问题的解释。我们只有一些小示例应用程序。 我希望证明自己是错误的。请给我展示一个干净的App设计模式,该模式可以解决大量生产就绪的Apps的问题。 提前致谢。 更新:悬赏活动将在几分钟后结束,很遗憾,仍然没有人能够提供有效的示例。但是,如果找不到其他解决方案并将其链接到此处,我将开始提供新的赏金来解决此问题。感谢大家的巨大贡献!

1
尝试重新访问SwiftUI中先前单击的NavigationLink时,NavigationLink冻结
我正在设计一个应用程序,该应用程序包括检索JSON数据并在FileBrowser类型视图中显示检索到的项目的列表的功能。在此视图中,用户应该能够单击文件夹以更深入地进入文件树,或者单击文件以查看有关该文件的一些元数据。 我观察到,在这种情况下,当我单击文件或文件夹然后再次单击并单击它时,不会触发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) } …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.