iOS/SwiftUI10 @StateObject vs @ObservedObject View와 Logic을 분리하기 위해 MVVM (Model - View - ViewModel) 패턴을 사용하는데ViewModel은 Logic을 담당하여 View에서 사용할 데이터를 가공하는 역할을 한다. SwiftUI에서는 ViewModel을 클래스로 구현하고 ObservableObject 프로토콜을 채택한다. 내부에는 View에서 사용할 데이터가 있어 @Published 프로퍼티로 해당 값의 변화를 알리게 되고메서드로 데이터를 가공할 수 있도록 한다. class MyViewModel: ObservableObject { @Published var myData: [MyModel] = [] func insert(data: MyModel) { myData.append(data) } fu.. 2024. 5. 13. LazyVGrid Scrollable LazyVGrid with Section Lazy가 붙으면 화면에 표시되는 부분에 한해 메모리를 로드하고 재사용한다.즉 데이터가 많은 경우 이를 한 번에 로드하여 보여주려면 로드하는데 시간이 걸리고 성능이 저하될 수 있으나LazyGrid 나 LazyStack같은 것을 사용하면 실제 화면에 보여주는 부분만 메모리를 로드하고 재사용하기 때문에 효율이 좋다. 이 글을 쓰는 이유는 LazyVGrid 안에서 Section을 사용하여 화면 스크롤 시 Section의 Header가 고정되어 상단에 계속 노출시키는 방법을 알게 되었기 때문이다. struct GridBootcamp: View { let columns: [GridItem] = [ GridItem(.flexibl.. 2024. 5. 3. Lifecycle event modifier 2개의 TabItem이 있는 TabView로 뷰의 생명주기를 관찰해보았다. 뷰가 나타날때와 사라질때를 관찰하려면 onAppear(perform:)과 onDisappear(perform:) modifier를 사용하면 된다. struct LIfeCycleEx: View { var body: some View { TabView { FirstTabView() .tabItem { Label("First", systemImage: "01.circle") } SecondTabView() .tabItem { Label("Second", systemImage: "02.circle") } } } } struct FirstTabView: View { var body: some View { Text("First Tab") ... 2023. 11. 23. NavigationStack struct NavigationStackContentView: View { var body: some View { NavigationStack { NavigationLink { DestinationView() } label: { Label("Navigation", systemImage: "safari") } .navigationTitle("NavigationStack") // .navigationBarTitleDisplayMode(.inline) } } } struct DestinationView: View { var body: some View { Text("Destination") } } NavigationStack은 root view를 가지고 있는 스택으로 스택의 가장 최상위에 있는 뷰가 보여지도록.. 2023. 11. 21. 이전 1 2 3 다음