我的 main.dart 中有一个 TabBarView,每个选项卡都有一个类来显示内容(它是 listview 对象),当我在选项卡之间切换时,listview 页面每次都会刷新,tabbarview 是否正常?我不希望每次在标签之间切换时它都会刷新。
是我班级的问题吗?如何解决这个问题?代码是这样的。
class ListWidget extends StatefulWidget {
final catID;
ListWidget(this.catID);
_ListWidgetState createState() => new _ListWidgetState(catID);
}
class _ListWidgetState extends State<ListWidget> {
var catID;
void initState() {
super.initState();
_fetchListData();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(.......
}
Run Code Online (Sandbox Code Playgroud) 我在 SwiftUI 中遇到了一个奇怪的问题。我创建了一个简单的 View,它只包含一个 Button 和一个使用 PageViewStyle 的 TabView。TabView 似乎没有根据变量的状态正确更新其内容。似乎内容以某种方式更新,但视图不会像我期望的那样更新
这是我的视图代码:
struct ContentView: View {
@State var numberOfPages: Int = 0
@State var selectedIndex = 0
var body: some View {
VStack {
Text("Tap Me").onTapGesture(count: 1, perform: {
self.numberOfPages = [2,5,10,15].randomElement()!
self.selectedIndex = 0
})
TabView(selection: $selectedIndex){
ForEach(0..<numberOfPages, id: \.self) { index in
Text("\(index)").background(Color.red)
}
}
.frame(height: 300)
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic))
}.background(Color.blue)
}
}
Run Code Online (Sandbox Code Playgroud)
这是多次点击标签后的结果。初始状态不是 0 页。在您点击后,我希望 TabView 的内容发生变化,因此所有页面都将是可滚动和可见的,但由于某种原因,只有页面指示器会更新它的状态。
感谢 Harshil 和 Sumit 指出我太愚蠢了,没有意识到我正在使用id()而不是tag(). 如果说你能从这个问题中学到什么,那就是:
当你独自完成一个项目时,你往往会变得盲目。你看不到自己的错误。进行代码审查。请朋友和同事查看一下。这是个好主意。;)
在我的 SwiftUI 项目中,我使用BindingTabView来$selection以编程方式切换选项卡。
问题是:例如,当我在上呈现工作表时,TabView选择中包含的第二个视图将重置为第一个选项卡。
对我来说,这似乎是一个SwiftUI 错误- 但有解决方法吗?
下面您可以找到一个演示该行为的工作示例。(使用Xcode 12.4测试)
如何测试:转到第二个选项卡,点击“二”按钮,您将看到返回到第一个选项卡。一旦您selection从 TabView 中删除该属性,这种情况就不会再发生。
奥兰多干杯
enum TabPosition: Hashable {
case one
case two
case three
}
struct RootView: View {
@State private var selection: TabPosition = .one
var body: some View {
TabView(selection: $selection) {
One()
.tabItem { Label("One", systemImage: "1.circle") }
.id(TabPosition.one) …Run Code Online (Sandbox Code Playgroud) 我TabView在我的主页上使用。假设我有 4 个选项卡。在第二个选项卡上,我可以使用 转到另一个视图NavigationLink,并使用 转到另外 2 个视图NavigationLink。然后在最新的视图上,有一个用于呈现视图的按钮,我使用它.fullScreenCover(因为我想全屏呈现它)。
在呈现视图中,我X在要关闭的左侧添加了一个标记navigationBarItems。我使用@Environment(\.presentationMode) var presentationMode和presentationMode.wrappedValue.dismiss()来驳回。但它只会将当前视图忽略到前一个视图,而实际上我想将它忽略到我的视图的根目录,即我的TabView.
有没有办法做到这一点?因为我查阅了一些文章,但没有任何相关的内容,特别是在TabView上下文中。
我也有一个问题:
.fullScreenCover?或者是否有另一种可能的解决方案,例如呈现全屏样式的模式(如果有任何原因我也不确定)。任何建议将不胜感激,提前谢谢。
所以我有一个 TabView,其中每个选项卡都嵌入在 NavigationView 中。在每个选项卡第一次出现时,我都会收到以下生命周期调用 onAppear()、onDisappear()、onAppear()。所以看起来 onAppear 被调用了两次。这只会发生第一次。如果我导航回同一个选项卡,则只会调用 onAppear(),而且只会调用一次。
这是一个最小的例子:
struct Page1: View {
init() { print("Page 1 init") }
var body: some View {
NavigationView {
Text("Page 1")
.onAppear(perform: { print("Page 1 appearing") })
.onDisappear(perform: { print("Page 1 disappearing") })
}
}
}
struct Page2: View {
init() { print("Page 2 init") }
var body: some View {
NavigationView {
Text("Page 2")
.onAppear(perform: { print("Page 2 appearing") })
.onDisappear(perform: { print("Page 2 disappearing") })
}
}
}
struct ContentView: View …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) 我有一个使用 swiftUI 2.0 PageTabViewStyle 的 TabView。有什么方法可以禁用滑动以更改页面?
我的第一个选项卡视图中有一个搜索栏,但是如果用户正在键入,我不想提供更改它们的功能,我基本上希望它被锁定在该屏幕上,直到所述功能完成。
这是一个显示差异的 gif,我希望在 gif 全屏时禁用选项卡更改。 https://imgur.com/GrqcGCI
我正在尝试使用 Flutter 和GetX构建一个用于状态管理的应用程序,在我的一个页面中,我需要在页面中间构建一个 TabView 小部件,我已经找到了很多解释如何构建 TabView 的内容小部件,如这篇文章和这篇文章,但所有这些都扩展了一个带有SingleTickerProviderStateMixin的状态控制器。
据我了解阅读文档,我不应该像那样使用 StatefulWidgets 和状态,但我无法弄清楚如何使用 GetX 架构来制定解决方案。
我已经在我的页面中尝试过:
class CourseDetailPage extends StatelessWidget {
final TabController _tabController = Get.put(TabController(vsync: null, length: 2));
}
Run Code Online (Sandbox Code Playgroud)
和
class CourseDetailPage extends StatelessWidget {
final TabController _tabController = TabController(vsync: null, length: 2);
}
Run Code Online (Sandbox Code Playgroud)
但是 TabController 的 VSYNC 参数不能为空,我不知道我如何无法获得 TickerProvider 来填充它。
使用 Swift 5.3.2、Xcode 12.4、iOS 14.4、
我正在尝试在 SwiftUI 中制作一个简单的 Page-TabView (参见下面的代码摘录)。
当旋转到横向或返回纵向时,出现问题(参见视频):
每当我旋转 iPhone 时,TabView 都会“跳转”到随机选项卡编号。
为什么是这样 ?
我该怎么做才能使 TabView 在旋转时保持当前选项卡号?
(我使用的是iPhoneX)
新的 iOS14 TabView 的 PageControl 功能似乎存在更多问题,如此处所述。(也许旋转设备时的“随机选项卡编号”与所描述的布局问题有关)
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
TabView {
Text("1")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.pink)
Text("2")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.yellow)
Text("3")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.green)
Text("4")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.blue)
}
.tabViewStyle(PageTabViewStyle())
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在处理 SwiftUI 中的一个简单按钮,布局如下:
TabView {
ForEach(...) { ...
Button {...}
label {...}
}
}
Run Code Online (Sandbox Code Playgroud)
当我点击(但不释放)按钮时,它会默认突出显示该按钮;这可以。但是,如果我将这些按钮排列在分页选项卡视图中,则通过滑动来导航页面会突出显示这些按钮,这是我不想要的。
有没有办法禁用这个突出显示?最好,我想在点击按钮时保留突出显示,但在滑动时不保留突出显示,但如果我必须完全禁用它也没关系。