【问题标题】:Intercept custom action on TabView拦截 TabView 上的自定义操作
【发布时间】:2021-08-20 02:02:36
【问题描述】:

我被推荐使用标准组件,所以我没有构建自己的 TabView,而是使用了 SwiftUI 的 TabView。我只需要一个不会激活视图但会触发操作的自定义操作。

我用下面的代码几乎成功了:

import SwiftUI

struct ContentView: View {
    @State var value: Int = 1

    private var adapterValue: Binding<Int> {
        Binding<Int>(get: {
            if (self.value == 4) {
                return 2
            } else {
                return self.value
            }
        }, set: {
            if $0 == 4 {
                self.value = 2
            } else {
                self.value = $0
            }
        })
    }

    var body: some View {
        TabView(selection: self.adapterValue, content:  {
            Text("A").tabItem {
                VStack {
                    Text("A")
                }
            }
            .tag(1)
            
            Text("B").tabItem {
                VStack {
                    Text("B")
                }
            }
            .tag(2)
            
            Text("C").tabItem {
                VStack {
                    Text("C")
                }
            }
            .tag(3)
            
            Text("D").tabItem {
                VStack {
                    Text("D")
                }
            }
            .tag(4)
        })
    }
}

它工作得很好,除了当标签 2 (B) 被激活并且我按 4 (D) 时,标签 4 (D) 被激活。这不应该发生,但我不确定我错过了什么。

我想了解这无法按预期工作的原因以及如何防止这种行为。

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    你可以试试这个:

    struct ContentView: View {
        @State var value: Int = 1
        
        var body: some View {
            TabView(selection: $value) {
                Text("A").tabItem {
                    VStack {
                        Text("A")
                    }
                }
                .tag(1)
                
                Text("B").tabItem {
                    VStack {
                        Text("B")
                    }
                }
                .tag(2)
                
                Text("C").tabItem {
                    VStack {
                        Text("C")
                    }
                }
                .tag(3)
                
                Text("D").tabItem {
                    VStack {
                        Text("D")
                    }
                }
                .tag(4)
            }
            .onChange(of: value) { val in
                if val == 4 {
                    self.value = 2
                }
            }
        }
    }
    

    【讨论】:

    • 它似乎完美无缺,谢谢!这显然是一个更好的解决方案,但是我仍然不确定为什么我的解决方案不起作用。我会做更多的测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多