Skip to content

Instantly share code, notes, and snippets.

@1dolinski
Last active October 22, 2020 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 1dolinski/87a2579662fa316d56e72f4b60b200fa to your computer and use it in GitHub Desktop.
Save 1dolinski/87a2579662fa316d56e72f4b60b200fa to your computer and use it in GitHub Desktop.
On TextField select, all tab views re-render
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@ObservedObject var viewModel1: ViewModel = ViewModel()
@ObservedObject var viewModel2: ViewModel = ViewModel()
@ObservedObject var viewModel3: ViewModel = ViewModel()
@ObservedObject var viewModel4: ViewModel = ViewModel()
var body: some View {
TabView {
SimpleView(viewModel: self.viewModel1, people: viewModel1.people, num: 1)
.tabItem {
Text("1")
}.onAppear{
print("tab 1 appear")
viewModel1.getPeople(num: 1)
}
SimpleView(viewModel: self.viewModel2, people: viewModel2.people, num: 2)
.tabItem {
Text("2")
}.onAppear{
print("tab 2 appear")
viewModel2.getPeople(num: 2)
}
SimpleView(viewModel: self.viewModel3, people: viewModel3.people, num: 3)
.tabItem {
Text("3")
}.onAppear{
print("tab 3 appear")
viewModel3.getPeople(num: 3)
}
SimpleView(viewModel: self.viewModel4, people: viewModel4.people, num: 4)
.tabItem {
Text("4")
}.onAppear{
print("tab 4 appear")
viewModel4.getPeople(num: 4)
}
}
}
}
import SwiftUI
struct SimpleView: View {
@State var text: String = ""
@State var viewModel: ViewModel
var people: [Person]
var num: Int
var body: some View {
VStack {
TextField("Enter text", text: self.$text)
ForEach(viewModel.people) { person in
Text(person.name)
}
}.onAppear {
print("\(num) simple view appear")
viewModel.getPeople(num: num)
}
}
}
// ALTERNATIVE CONTENT VIEW TAB SELECTION OPTION
/* 1 simple view appear
1 get people
4 simple view appear
4 get people
tapped tab 4
2 simple view appear
2 get people
3 simple view appear
3 get people
*/
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@State private var selectedTab = 1
@ObservedObject var viewModel1: ViewModel = ViewModel()
@ObservedObject var viewModel2: ViewModel = ViewModel()
@ObservedObject var viewModel3: ViewModel = ViewModel()
@ObservedObject var viewModel4: ViewModel = ViewModel()
var body: some View {
TabView(selection: $selectedTab) {
SimpleView(viewModel: viewModel1, people: viewModel1.people, num: 1)
.onTapGesture {
self.selectedTab = 1
print("tapped tab 1")
}
.tabItem {
Image(systemName: "star")
Text("1")
}
.tag(1)
SimpleView(viewModel: viewModel2, people: viewModel2.people, num: 2)
.onTapGesture {
self.selectedTab = 2
print("tapped tab 2")
}
.tabItem {
Image(systemName: "star")
Text("2")
}
.tag(2)
SimpleView(viewModel: viewModel3, people: viewModel3.people, num: 3)
.onTapGesture {
self.selectedTab = 3
print("tapped tab 3")
}
.tabItem {
Image(systemName: "star")
Text("3")
}
.tag(3)
SimpleView(viewModel: viewModel4, people: viewModel4.people, num: 4)
.onTapGesture {
self.selectedTab = 4
print("tapped tab 4")
}
.tabItem {
Image(systemName: "star")
Text("4")
}
.tag(4)
}.ignoresSafeArea(.keyboard, edges: .bottom)
}
}
import Foundation
struct Person: Identifiable, Equatable {
let id = UUID()
let name: String
}
class ViewModel: ObservableObject {
@Published var people: [Person] = []
func getPeople(num: Int) {
print("\(num) get people")
DispatchQueue.main.async {
let person = Person(name: "Hank \(num)")
self.people.append(person)
}
}
}
@1dolinski
Copy link
Author

Flow

  1. Run App
  2. Click Tab 4
  3. Focus textfield

Result:

// ON LOAD
1 simple view appear
1 get people
tab 1 appear
1 get people

// SELECT TAB 4
4 simple view appear
4 get people
tab 4 appear
4 get people

// FOCUS TAB 4 TEXT FIELD -> ALL TABS RENDER
2 simple view appear
2 get people
tab 2 appear
2 get people
3 simple view appear
3 get people
tab 3 appear
3 get people
tab 1 appear
1 get people
1 simple view appear
1 get people

@1dolinski
Copy link
Author

Added TabSelectionContentView.swift to show tab number condition implementation, similarly the views and vm render on text field focus

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment