问题标签 [swiftui-tabview]

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.

0 投票
2 回答
353 浏览

xcode - 如何使用 SwiftUI 从 TabView 内的 ForEach 中删除项目?

我有一个奇怪的 SwiftUI 崩溃,我不明白。我有一个 TabView,里面有 3 个图像的列表。我试图通过点击屏幕上的按钮从列表中删除第一个图像,但我遇到了这个崩溃。

'NSInternalInconsistencyException',原因:'尝试删除并重新加载相同的索引路径(<NSIndexPath:0x968bfe135e5a98d1> {length = 2,path = 0 - 0})'以 NSException 类型的未捕获异常终止

如果我从代码中删除 TabView,它会按预期工作并删除第一项。这是重现此崩溃所需的最少代码量。我还在这里创建了此代码的 Git 存储库-> https://github.com/cameronhenige/TestCrash有人可以帮我弄清楚发生了什么吗?

0 投票
1 回答
559 浏览

swift - 在第一个索引处将新元素插入集合时,如何使用 PageTabViewStyle 修饰符在 TabView 中更新 SwiftUI 的 ForEach

ForEachTabViewwithPageTabViewStyle修饰符中使用时,这是一个非常具体的问题。

每次我在数组的开头插入一个元素时,我的应用程序都会崩溃。

我得到一个

尝试从更新前仅包含 11 个项目的第 0 节中删除第 11 项

错误。

在画布中它也崩溃了。

最后的常规附加工作正常,当我删除 PageTabViewStyle 修饰符时它也可以工作。

让我知道我是否需要详细说明或是否有问题。

更新:我似乎在 iOS 15 中这个问题已经修复并且我的代码有效。我仍然希望找到 iOS 14 的解决方法。

我用一个简单的单页应用程序重现了这个问题:

0 投票
0 回答
266 浏览

swift - 如何使 SwiftUI TabView 背景透明?

我注意到虽然 SwiftUI 中的大多数视图都是透明的,但TabView似乎为每个视图添加了不透明的背景。所以我的问题是我怎样才能删除所说的不透明背景以使视图透明?

我尝试使用这个 StackOverflow 答案中的辅助扩展只是它似乎使我的第一个选项卡透明而不是其余选项卡,并且编译器抛出了很多警告和偶尔的错误,所以我不确定这是否是一种安全的删除方式的背景。

我还遇到了另一个关于 Hacking with Swift 的讨论,它揭示了一些TabView样式,即PageTabViewStyle,实际上允许透明背景。所以我决定尝试做一个 custom TabViewStyle,只是我完全被这个难住了:

我不确定_GraphValue,_TabViewValue和其他数据类型是什么,但我认为它们是用于构建视图的某种隐藏值?

我还考虑添加一个扩展来DefaultTabViewStyle修改那里的背景(如果可能的话),只是我不知道在哪里可以访问TabView's 背景,因为唯一可用的东西似乎是self.

我最后的手段可能是从头开始制作自定义标签栏,但我不希望这样做。那么使我TabView的背景透明的最佳解决方案是什么?如果它正在定制 a TabViewStyle,至少有人可以为我指出实现_makeViewand_makeViewList功能的正确方向吗?

任何帮助将不胜感激!

编辑:由于某种原因,我以前尝试过它时它没有用,但这个答案似乎有效:https ://stackoverflow.com/a/63179684/12299030

编辑:实际上,这个解决方案(https://stackoverflow.com/a/63179684/12299030)似乎只适用于 Xcode 模拟器。我刚刚在实际设备上测试了我的应用程序,并且视图不再透明。

0 投票
0 回答
41 浏览

swiftui - 如何在 SwiftUI 的子视图中隐藏 TabView 叠加层?

我有一个带有自定义 TabBar 和覆盖的 TabView:https ://jboullianne.medium.com/custom-tabbar-e8f2ea89d2fc

我能够使用 Introspect 在子视图中隐藏 TabBar:https ://github.com/siteline/SwiftUI-Introspect

但我也想隐藏子视图中的覆盖以完全隐藏 TabBar。

我该如何隐藏它?

我的测试代码试图隐藏 TabBar(工作,请参阅 TestTabBarPage3)和覆盖(如何???):

测试标签栏

TestTabBarPage1

TestTabBarPage2

TestTabBarPage3

0 投票
1 回答
251 浏览

swift - 如何防止触发 SwiftUI TabView 中非活动选项卡的 onChange 关闭

当设置带有两个选项卡的 SwiftUI TabView 时,监听 @State 或 @Binding 变量的非活动(不可见)选项卡的 onChange 闭包将始终在从活动选项卡更改变量时触发。

我希望只要选项卡未处于活动状态,就不会触发 onChange。使用两个不同的导航链接时,它的工作原理基本相同。但我认为它以某种方式使非活动选项卡在后台完全活跃。

我尝试为每个选项卡视图分配标签,以便视图可以识别活动选项卡。我读到这可以解决问题,但事实并非如此。

这是一个显示问题的简单 SwiftUI 应用程序。当第二个选项卡处于活动状态并且我单击按钮时,第一个选项卡的 onChange 将被触发并打印到控制台。

如果我需要提供不同的示例或有问题,请告诉我。

注意:在使用 onReceive 时也会发生这种情况,例如监听 ObservableObject 的 @Published 变量的变化。

0 投票
0 回答
246 浏览

ios - SwiftUI TabView 在 ViewModel 使用选择索引导致所有视图为空白

所以这是我的应用程序的简化版本,我尝试过重现错误,我有一个带有 2 个选项卡的 TabView(HomeView &OrderView),如果我使用 viewModel 放置选择索引,每次我去 OrderView 并返回 HomeView, HomeView 中加载的视图将消失,这对于其他选项卡中的所有视图和任何其他视图都是一样的。

调试日志中没有任何错误日志,API 获取完美,如果我打印它们,数据就在那里,变量也都很好,但是 UI 只在第一次加载时出现(在切换选项卡之前),然后它就消失了在我切换标签后。

如果我删除选项卡选择索引或使用@State 将索引放置在 ContentView 中,一切正常,但我需要将索引放在 ViewModel 中,以便我可以从另一个视图修改索引。

这种行为有什么问题?非常感谢您提前

内容视图.swift

HomeViewModel.swift

HomeView.swift

MenuListView.swift

MenuListViewModel.swift

前

后

所以我有截图,在第一个应用程序启动时,数据被加载并正确加载到视图中,然后如果我点击第二个选项卡,然后返回第一个选项卡,视图就消失了(加载的数据和所有变量在日志中正确,也没有任何错误日志)

0 投票
0 回答
54 浏览

ios - 在 SwiftUI 中使用 Introspect 隐藏 TabBar 时视图调整大小/扩展的底部

我正在使用 Introspect 在 SwiftUI 中隐藏子视图上的 TabBar。但是,我注意到一些奇怪的行为。

导航到子视图时,TabBar 似乎仍然继续占用空间,但是当应用程序后台运行或打开控制中心/通知中心时,空间消失了。

在某些情况下,问题只发生在子视图中,但在大多数情况下,它也会发生在父视图中。以下是执行此操作的步骤:

  • 导航到子视图。
  • 将应用移至后台。
  • 再次打开应用程序。您会注意到绿色视图被推到了底部。
  • 现在回到父视图。该空间也消失了,如果我们真的有一个 tabBar 显示,绿色视图将在 tabBar 后面!

我还使用@EnvironmentObject了不同视图中的 TabBar 隐藏控件,问题仍然存在。

在某些情况下,使用.edgesIgnoringSafeArea(.bottom)使子视图在底部进入某种“全屏”状态,实际上解决了问题,但是对于选项卡式视图,绿色视图仍然位于 TabBar 的后面。

如果有一种方法可以知道选项卡视图上的 tabBar 高度并始终将填充设置为.padding(.bottom, self.tabBarHeight)或类似的东西,我认为可以通过这种解决方法解决问题,但是仍然需要隐藏 TabBar 的工作量太大。

这是一个测试行为的代码示例:

0 投票
1 回答
172 浏览

swift - onChange(of: perform:) 枚举在 swiftui 中不起作用

以下代码应在选项卡更改时打印值,但未按预期打印。如果我使用选定的数据类型(如 Int 或字符串)而不是枚举,则相同的代码可以正常工作。

我是否需要确认枚举才能完成这项工作?

提前致谢

0 投票
1 回答
81 浏览

ios - 使用 @EnvironmentObject 无休止地重新渲染 Swift UI Tabview

我有一个 @ObservableObject 我要传递给一个视图,使用:

在这种情况下,我正在使用:

我正在尝试将一些数据向下传递到更深的视图中,该视图将在列表中呈现该数据。

在 DataListView(上图)中,我有以下内容:

我也尝试过使用:

分别在 tabView 和 DataListView

由于某种原因,可能是由于我自己的无知,Tabview 无休止地渲染。

我也尝试过以相同的结果传递整个状态对象和其他参数/​​参数组合,但我基本上是在猜测这一点。

正在使用的设置是在 TabView 渲染之前设置的items,并且它们在任何时候都不会发生变异,所以我不确定是什么触发了重新渲染。

此问题仅在传递到“第三”级别时发生。换句话说,如果我在 TabView 中渲染列表,就没有无穷无尽的重新渲染。

同样,有 99% 的可能性是我不了解数据应该如何流动,因此任何关于将这些数据向下传递而无需进行无休止的重新渲染的技巧将不胜感激。

郑重声明,这一切都发生在 Xcode 13 beta 4 中。

0 投票
0 回答
199 浏览

ios - SwiftUI - TabView automatically changes selection when size changes

I have a paging style TabView in a HStack with another view. I'm adding a selection binding to the TabView to programmatically control selection.

When a tab is tapped the second view in the HStack disappears and the TabView resizes to fill the space.

However, if this is done after scrolling through my TabView's contents what happens is the selection changes many times as the size changes, causing the TabView to erratically scroll through many pages, rather than stay on the same selection and resize.

To reproduce:

  1. Create a new project
  2. Replace ContentView with the following code
  3. Scroll through ~20 pages
  4. Tap on the rectangle (blue or red)

The selection will change by itself.

Tested on iOS 14.5