MVVM이 뭔지는 대충 아시는 분들이 많겠지만 막상 구현하라고 하면 어떻게 구현해야 하는지 막막한 경우가 많습니다. 이 포스팅에서는 간단한 TodoList를 통하여 제가 공부한 구성을 정리하겠습니다. 한번에 완성된 글을 쓰려고 하니 시작을 안 하는거 같아. 쪼개서 쓰고 나중에 합치겠습니다.. 코드의 구조 View LauchScreen ListView ListRowView AddView NoItemsView Model ItemModel ViewModel ListViewModel * 게시글에 언급되는 코드와 결과물은 Swiftful Thinking의 SwiftUI Todo List (Beginner Level)에서 나온 내용임을 밝힙니다. ** (https://www.youtube.com/playlist?l..
기존에 잘 쓰고 있던 navigationBarItems가 deprecated 됐습니다. 제가 공부하는 자료에서는 navigationBarItems로 trailing 버튼과 leading 버튼을 설정하네요. 엑스코드는 이제 toolbar를 이용하여 trailing과 leading을 설정하라고 안내해주니까 예시 코드를 만들어봤습니다. 기존 navigationBarItems를 이용할 시, 왼쪽에 수정 버튼을 두고 오른쪽에는 뷰 이동이 필요하다면 다음과 같이 코딩을 해야 했습니다. .navigationBarItems { leading: EditButton(), trailing: NavigationLink("추가", destination: 추가View()) } ToolbarItem을 사용하여 같은 디자인을 만들고..
1. Set의 유용함과 Array랑은 주로 사용되는 메소드가 다른 걸 느꼈다. 약간 각자 유용한 경우가 다르므로 그에 해당되게 쓰면 되겠다는 생각이 든다. 2. SwiftUI에서 Spacer를 사용하여 레이아웃을 지정할 떄, 생각만큼 이쁘게 안 되는 경우가 많다고 느꼈다. 화면 내 나오는 요소가 많아지고 복잡해질수록, 가로 모드일수록 원하는 모양을 만들어내기가 힘든 것 같다.
NavigationView { NavigationLink { TargetView() } label: { DesignedCell() } .onTapGesture { let str:String = "This is onTapGesture" print(str) } } 위와 같은 코드로 사용자는 DesignedCell로 요소를 만들었으며 터치하여 TargetView로 이동하려고 한다고 가정해봅시다. 여기서 개발자는 모종의 이유로 print()를 사용하던지 변수를 수정하기 위해 onTapGesture를 병행하여 사용하고 싶은 경우가 있습니다. NavigationView 안에서는 위에서 의도한대로 작동하지 않습니다. 제가 실험해본 바로는 onTapGesture가 먼저 작용되고 Link는 작동되지 않네요. 이를 해결하..
1. Navigation은 정보의 연속성이 있는 전환을 의도할 때 쓰고, Modal은 그렇지 않다. 화면 이동에 대해 예전에 멘토에게 물어봤을때, 스택에 쌓이는 구조로 들어가기 때문에 여러번 Navigation으로 이동했을시 메인화면으로 돌아가는 구현을 하는것에 애를 먹었던 기억이 있다. 해당 View 안에서 데이터를 입력하거나 수정하는 용도라면 Modal을 이용하여 구현하는것이 바람직하다. 보통 날짜나 시간을 설정할 때 많이 쓰게 된다. 2. UIKit에서는 데이터가 중복되서 존재하는 경우가 흔하기에 충돌 등의 문제가 있었다. (Duplicated Source of Truth) 하지만 SwiftUI에서는 Singe Source of Truth으로 해당된다. 그러므로 데이터가 단방향으로 흐르기 때문에 보..
문제 상황 SwiftUI의 View Struct에서 이중 배열을 만들고 상황에 맞게 내부 배열에 append와 removeLast를 하려 했으나 "Thread 1: Fatal error: Index out of range" 에러가 발생했다. 이중 배열 안에서 첫번째 배열에는 정상적으로 데이터 입출력이 되는 상황이었고 두번째 배열에 접근하려고 하면 문제가 반복되는 상황이었다 해결 @State var Record: [[String]] = [[]] //