onl1ner / TabBar

📱 TabBar – highly customizable tab bar (i.e. TabView) for your SwiftUI application.
MIT License
415 stars 43 forks source link

Every tab item has a view, is it possible to give no view to tabitem #17

Closed vchaubey-ontic closed 1 year ago

vchaubey-ontic commented 1 year ago

The idea behind doing this, I want to open a view on the top of previous selected view instead of opening a new view.

onl1ner commented 1 year ago

Hello, @vchaubey-ontic!

I did not get your question, can you please clarify using some examples/use cases reflecting your idea?

vikaschaubey57 commented 1 year ago

Ok, let me try. My implementation is something like this -

       TabBar(selection: $selection, visibility: $visibility) {
            Home()
                .tabItem(for: TabItems.first)

            Search()
                .tabItem(for: TabItems.second)

            AddView()
                .tabItem(for: TabItems.third)

            Notifications() {
            .tabItem(for: TabItems.fourth)

            More()
                .tabItem(for: TabItems.fifth)
       }

Right now every tab have their own view, right?, what I want to achieve is, when I click 4th tab i.e More

  1. Most Recent / Previous selected tab should be highlighted instead of more.
  2. Instead opening a new View More() , it should present on Most Recent / Previous selected tab like a popup and on dismiss popup @state of Most Recent / Previous selected should persist so that it always looks a like a view presented on instead opening a new tab.

Ex: I have to present some Menu on 4th tab and previous selected view should be visible.

onl1ner commented 1 year ago

@vikaschaubey57, got it. Unfortunately, there is no way to implement that using the toolkit provided by this library, but you can workaround that by wrapping More view into some entity that will automatically on onAppear call present your view as a sheet.

Here is quick and dirty way to achieve this:

// Wrapper.swift

struct Wrapper<Content: View>: View {
    private let content: Content

    @State private var isPresented: Bool = false

    init(content: Content) {
        self.content = content
    }

    var body: some View {
        Color.clear
            .sheet(isPresented: self.isPresented, content: { self.content })
            .onAppear { self.isPresented = true }
    }
}

// TabBar.swift

TabBar(selection: $selection, visibility: $visibility) {
    Home()
        .tabItem(for: TabItems.first)

    Search()
        .tabItem(for: TabItems.second)

    AddView()
        .tabItem(for: TabItems.third)

    Notifications() {
        .tabItem(for: TabItems.fourth)

    Wrapper(content: More())
        .tabItem(for: TabItems.fifth)
}

Hope it helps :)

onl1ner commented 1 year ago

Closing due to inactivity, feel free to reopen if the issue still exists