Sai Durga Mahesh
Sai Durga Mahesh

Reputation: 245

onChange(of: perform:) with enums not working in swiftui

Following code should print value when tab changes, But it is not printing as expected. The same code is working fine if I use the selected data type like Int or string instead of an enum.

Do I need to confirm enum to anything for making this work?

enum Tab: String, Codable, Comparable {
    static func < (lhs: Tab, rhs: Tab) -> Bool {
        lhs.rawValue < rhs.rawValue
    }
    
    case firstTab
    case secondTab
    case thirdTab
}

struct ContentView: View {
 
    @State var selected: Tab = .firstTab
    var body: some View {
        TabView(selection: $selected) {
            Text("first tab")
                .tabItem {
                    Text(Tab.firstTab.rawValue)
                }.tag(Tab.firstTab.rawValue)
               
            Text("second tab")
                .tabItem {
                    Text(Tab.secondTab.rawValue)
                }.tag(Tab.secondTab.rawValue)
            Text("third tab")
                .tabItem {
                    Text(Tab.thirdTab.rawValue)
                }.tag(Tab.thirdTab.rawValue)
        }.onChange(of: selected, perform: { value in
            print(value)
        })
    }
}

Thanks in advance

Upvotes: 0

Views: 866

Answers (1)

Raja Kishan
Raja Kishan

Reputation: 19044

Remove .rawValue for each tag as your TabView use enum case for selection, not your case string (.rawValue)

TabView(selection: $selected) {
    Text("first tab")
        .tabItem {
            Text(Tab.firstTab.rawValue)
        }.tag(Tab.firstTab) //< -Here
    
    Text("second tab")
        .tabItem {
            Text(Tab.secondTab.rawValue)
        }.tag(Tab.secondTab) //< -Here
    Text("third tab")
        .tabItem {
            Text(Tab.thirdTab.rawValue)
        }.tag(Tab.thirdTab) //< -Here

Do I need to confirm enum to anything for making this work?

No. No need to confirm anything more.

Just make it simple

enum Tab: String {
    case firstTab
    case secondTab
    case thirdTab
}

Upvotes: 3

Related Questions