我正在尝试使用 SwiftUI 在 macOS 上制作一个选项卡式应用程序,但我在TabView.
当我有两个选项卡与TextField每个S和挽救他们的文本状态,各自的私有变量,一个奇怪的现象发生了:当我从切换标签一到片乙文本输入到后项卡A的TextField,标签指标显示,我还是上选项卡 A,但内容显示选项卡 B的内容。当我再次单击选项卡 B的按钮时,它仍会显示选项卡 B的内容。此外,当我之后按下选项卡 A的按钮时,它会显示选项卡 A的内容,但选项卡的指示器仍然显示我在选项卡 B 上。
我可能做错了什么?
这是一个说明我的问题的示例:
import SwiftUI
struct ContentView: View {
var body: some View {
TabView
{
TabAView()
.tabItem({Text("Tab A")})
TabBView()
.tabItem({Text("Tab B")})
}
}
}
struct TabAView: View {
@State private var text = ""
var body: some View …Run Code Online (Sandbox Code Playgroud) 我有一个菜单栏,子菜单上有两个项目,两个都调用同一页面:
<p:menubar autoSubmenuDisplay="true">
<p:submenu label="Perfil">
<p:menuitem value="Editar" url="perfil.xhtml" />
<p:menuitem value="Ver" url="perfil.xhtml" />
</p:submenu>
</p:menubar>
Run Code Online (Sandbox Code Playgroud)
在那个页面中,我有一个带有两个标签的tabview:
<p:tabView dynamic="true">
<p:tab id="ver" title="Ver perfil">
<ui:include src="verPerfil.xhtml" />
</p:tab>
<p:tab id="editar" title="Editar perfil">
<ui:include src="editarPerfil.xhtml" />
</p:tab>
</p:tabView>
Run Code Online (Sandbox Code Playgroud)
如何设置活动选项卡,以便每个菜单项激活相应的选项卡?
Active Index未自动更新.通过将tabView放在可以使用的表单上来回顾一些帖子.或者通过<p:ajax event="tabChange"/>在tabview中包含它是有效的.但似乎没有任何效果
XHTML
示例1:自动更新
<p:tabView id="categoryTabView" var="promoArticle" value="#{promotionDetailBean.artDTOs}" activeIndex="#{promotionDetailBean.activeTabIndex}">
<p:tab id="categoriesTab" title="#{promoArticle.categoryName}">
<p:dataTable id="promotionDetail_dataTable" var="articlePromo" value="#{promoArticle.artVO}" selection="#{promotionDetailBean.selectedArt}" rowIndexVar="rowIndex">
<p:column id="select" selectionMode="multiple" />
<p:column id="barCode">
<h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}"
styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView',#{promotionDetailBean.activeTabIndex}, 'promotionDetail_dataTable',#{rowIndex},'originalCostInputTxt')" />
</p:column>
</p:dataTable>
</p:tab>
</p:tabView>
Run Code Online (Sandbox Code Playgroud)
示例2:更新tabChange事件
<h:form id="form">
<p:growl id="growlm" showDetail="true" />
<p:tabView id="categoryTabView" var="promoArticle" value="#{promotionDetailBean.artDTOs}" >
<p:ajax event="tabChange" listener="#{promotionDetailBean.tabChanged}" update=":growlm" />
<p:tab id="categoriesTab" title="#{promoArticle.categoryName}">
<p:dataTable id="promotionDetail_dataTable" var="articlePromo" value="#{promoArticle.artVO}" selection="#{promotionDetailBean.selectedArt}" rowIndexVar="rowIndex">
<p:column id="select" selectionMode="multiple" />
<p:column id="barCode">
<h:inputText id="barCodeInputTxt" value="#{articlePromo.barCode}"
styleClass="inputTextStyle" onchange="onSuggestedValueChange('categoryTabView',#{promotionDetailBean.activeTabIndex}, 'promotionDetail_dataTable',#{rowIndex},'originalCostInputTxt')" />
</p:column>
</p:dataTable>
</p:tab> …Run Code Online (Sandbox Code Playgroud) 如何TabView在SwiftUI中为选中的Tabbar项目设置动画?
例如,给选定的项目一个.scaleEffect()带有.spring()动画或某物的内容,如下所示:
到目前为止,这是我尝试过的:
struct MyTabbedView: View {
@State var enlargeIt1 = false
@State var enlargeIt2 = true
var body: some View {
TabView {
Text("Item 1")
.onAppear {
self.enlargeIt1.toggle()
self.enlargeIt2.toggle()
}
.tabItem{
VStack{
Image(systemName: "music.note")
.font(self.enlargeIt1 ? .system(size: 30) : .system(size: 15) )
.animation(.interpolatingSpring(mass: 0.7, stiffness: 200, damping: 10, initialVelocity: 4))
Text("Music")
}
}.tag(1)
Text("Item 2")
.onAppear {
self.enlargeIt1.toggle()
self.enlargeIt2.toggle()
}
.tabItem{
VStack{
Image(systemName: "music.mic")
.font(self.enlargeIt2 ? .system(size: 30) : .system(size: 15) )
.animation(.interpolatingSpring(mass: …Run Code Online (Sandbox Code Playgroud) 我在 SwiftUI 2.0 和 Xcode 12 中使用 UITabBarController,但似乎键盘盒出现了一些意外行为。正如您从下面的 GIF 中看到的,当键盘出现在第一个选项卡中时,调用了其他 2 个选项卡视图的 OnAppear。这导致了这个问题,因为我有一个写在上面的 API 调用出现。
另外,有什么方法可以关闭 Xcode 12 的默认视图偏移行为。
这是我的内容视图代码。
struct ContentView: View {
@State private var index:Int = 0
var menuItems:[String] = ["Item 1", "Item 2", "Item 3"]
var body: some View {
NavigationView(content: {
ZStack{
MyTabView(selectedIndex: self.$index)
.view(item: self.item1) {
NewView(title: "Hello1").navigationBarTitle("")
.navigationBarHidden(true)
}
.view(item: self.item2) {
NewView(title: "Hello2").navigationBarTitle("")
.navigationBarHidden(true)
}
.view(item: self.item3) {
NewView(title: "Hello3").navigationBarTitle("")
.navigationBarHidden(true)
}
}.navigationBarHidden(true)
.navigationBarTitle("")
})
}
var item1:MyTabItem {
var item = …Run Code Online (Sandbox Code Playgroud) 我有一个TabView,每个选项卡都有它自己的NavigationPath,我正在一个ObservableObject.
@MainActor final class Router: ObservableObject {
@Published var homeNavigationPath = NavigationPath()
@Published var searchNavigationPath = NavigationPath()
@Published var notificationsNavigationPath = NavigationPath()
@Published var profileNavigationPath = NavigationPath()
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了让每个选项卡都可以自行 PopToRoot。一切似乎都运行良好,但是我在控制台中收到以下消息......
更新 NavigationAuthority 绑定路径尝试每帧更新多次。
有谁知道这意味着什么?我做错了什么还是拥有多个NavigationPath这样的 s 完全没问题吗?
我正在SwiftUI(Xcode 11.1、Swift 5.1和iOS 13.1.3)中制作一些TabView按钮。
对于我的TabView,我不想要任何图像——只是文本。这段代码很好地完成了:
import SwiftUI
struct ContentView: View {
var body: some View {
TabView {
Text("The First Tab")
.tabItem {
Text("My Projects")
}
Text("Another Tab")
.tabItem {
Text("Augmented Reality")
}
Text("The Last Tab")
.tabItem {
Text("Products")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,文本最终会与标签栏项目的最底部对齐,如下所示:

我想要的是标签栏不要为图标保留空间,而是将文本垂直居中——类似于这个模型:
我试过把它贴在VStack 中并尝试调整对齐方式,但没有任何改变。
是否有一些聪明的方法可以做到这一点,或者我是否需要通过特定数量的点进行某种偏移?
另外仅供参考,Apple 的开发人员文档说,“选项卡视图仅支持文本、图像或图像后跟文本类型的选项卡项。传递任何其他类型的视图会导致可见但空的选项卡项。 ”
我应该补充一点,我可以使用.offset来调整整个TabView,但这显然不是我们想要的。 .tabItem本身忽略任何.offset …
看起来Apple的TabView支持自动重新排列,但是在单击选项卡后它很快就会失去重新排列。
这是我的游乐场代码。
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
@State var arr = ["1","2","3","4","5","6"]
var body: some View {
TabView {
ForEach(self.arr, id: \.self) { name in
Text("Tab \(name) content")
.tabItem {
Image(systemName: "\(name).square.fill")
Text(name)
}
}
}
.font(.headline)
}
}
PlaygroundPage.current.setLiveView(ContentView())
Run Code Online (Sandbox Code Playgroud)
这是我在 gif 中执行的步骤。
我不确定这是否是一个 SwiftUI 错误,或者是否有一个我应该听的 onRearrange 钩子或者什么。
我正在尝试使用页面样式在 TabView 中添加一些内容插入。是否可以更改 TabView 内容宽度,以便它可以显示下一个和上一个视图的一部分?我可以轻松地使用 HStack 或 ScrollView 来完成此操作,但我想知道是否也可以使用 TabView 来完成此操作,因为 TabView 有许多我在这种情况下需要的功能。
我的测试代码如下所示:
var body: some View {
TabView {
Group {
ExcursionView(index: 1, count: 3)
ExcursionView(index: 2, count: 3)
ExcursionView(index: 3, count: 3)
}
.padding(.horizontal, 20)
}
.tabViewStyle(.page)
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试检测可滑动的 TabView 上的长按手势。
问题是它目前禁用了 TabView 的可滑动行为。在单个 VStack 上应用手势也不起作用 - 如果我点击背景,则不会检测到长按。
这是我的代码的简化版本 - 它可以复制粘贴到 Swift Playground 中:
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
@State var currentSlideIndex: Int = 0
@GestureState var isPaused: Bool = false
var body: some View {
let tap = LongPressGesture(minimumDuration: 0.5,
maximumDistance: 10)
.updating($isPaused) { value, state, transaction in
state = value
}
Text(isPaused ? "Paused" : "Not Paused")
TabView(selection: $currentSlideIndex) {
VStack {
Text("Slide 1")
Button(action: { print("Slide 1 Button Tapped")}, label: {
Text("Button …Run Code Online (Sandbox Code Playgroud)