Conversation
pedro0527
left a comment
There was a problem hiding this comment.
혼자 세상 많이 했던 ㄹㅇ 솔 커톤 수고했승wOn
| // MARK: - Properties | ||
|
|
||
| private let places: [PlaceSearchDTO] | ||
| private let placeDetailAction: ((Int, Int) -> Void)? | ||
| private let registerAction: (() -> Void)? | ||
|
|
||
| // MARK: - Initializer | ||
|
|
||
| init( | ||
| places: [PlaceSearchDTO] = [] | ||
| places: [PlaceSearchDTO] = [], | ||
| placeDetailAction: ((Int, Int) -> Void)? = nil, | ||
| registerAction: (() -> Void)? = nil | ||
| ) { | ||
| self.places = places | ||
| self.placeDetailAction = placeDetailAction | ||
| self.registerAction = registerAction |
| PlaceDataView(places: store.state.places) { townId, placeId in | ||
| appCoordinator.navigate(to: .placeDetail(townId: townId, placeId: placeId)) |
There was a problem hiding this comment.
오 이렇게 바꾼거구나....
이렇게 하면 원래 내가 했던 방식이랑 비교해서 더 좋은점? 그런게 있는건가여
There was a problem hiding this comment.
화면 전환은 PlaceDataView가 하는 게 아니라 PlaceSearchView가 하는 게 맞다고 생각헀어요 그래서 Subview까지 AppCoordinator를 들고 있을 필요가 없다고 생각하여 이렇게 수정했어요!
| extension RegisterCompleteView { | ||
| func waitForLottie() async { | ||
| try? await Task.sleep(nanoseconds: 2_000_000_000) | ||
| appCoordinator.goToRoot() | ||
| } | ||
| } |
There was a problem hiding this comment.
로띠 약간 왼쪽으로 가있는거 어케 해결해...?
There was a problem hiding this comment.
나만 그렇게 느끼던 거 아니었구나.. Preview에서 영역 잡아가면서 확인했는데, 중앙이긴 하거든요..? 근데 기분탓인진 모르겠는데 왼쪽으로 좀 치우친 느낌... 오늘 qa받고 이상하다 하면 수정해 볼게용
| .onChange(of: text) { _, newValue in | ||
| onChange?(text) | ||
| } |
There was a problem hiding this comment.
나 그 장소 검색할 때 생각해보다가 결국 엔터키나 검색 아이콘을 눌렀을때 검색 기능을 하는건데 굳이 change가 필요할까? 싶어서 지웠는데 꼭 필요할까??
There was a problem hiding this comment.
그건 맞는데, onSubmit이 사용자가 키보드의 enter를 누를 때 불린다고 해서
사용자가 그냥 화면을 눌러서 키보드를 내릴 경우를 대비해 onChange를 두긴 했어요
(onSubmit은 사용자가 키보드의 return키를 누르지 않으면 호출되지 않는다고 합니다)
There was a problem hiding this comment.
- 그때 장소 검색에서도 빈값 넣고 검색하면 화면 안바뀌고 그대로 놔뒀는데 그거 처리 안한거지?
There was a problem hiding this comment.
맞습니다! 아직 안 해놨어요
There was a problem hiding this comment.
그리고 나 앱잼때도 난 엔티티 안쓰고 하긴 했는데....혹시 무조건 엔티티를 써야하는건가여?
내가 설명해줬는데 기억 못하는거면 미안..😢
There was a problem hiding this comment.
그때는 시간이 부족해서 그래도 DTO를 가져다 사용헀지만, DTO랑 Entity는 계층이 다르다고 생각하면 됩니다!
사실 클린아키의 일부를 채택한 느낌..
DTO는 서버랑 통신하기 위한 객체이고, Entity는 순수 데이터 모델이라 네트워크 계층에서는 DTO만 알면 되고, Presentation에서는 Entity만 알고 있으면 돼요
나중에 DTO에 필드명이 바뀌거나 그러면 DTO -> Entity로 변환하는 그 코드만 수정하면 되겠죠?
반면 DTO를 사용하면 Service나, Reducer에서도 코드를 다 수정해야 합니다. 즉, 전체 계층에 수정사항이 생기기 때문에 이를 방지하고자 Entity로 변환하여 사용하는 것도 있어요
There was a problem hiding this comment.
나중에 같이 클아 공부하면서 이유를 더 찾아봅시다!
| Rectangle() | ||
| .frame(maxWidth: .infinity) | ||
| .frame(height: 1.adjustedHeight) | ||
| .foregroundStyle(.gray200) |
There was a problem hiding this comment.
divider 말고 이 방법도 있군 good
📄 작업 내용
💻 주요 코드 설명
이 뷰 분기처리..
저는 첨에 네비게이션인 줄 알았는데
모든 요소하 하나의 뷰에서 계속 분기처리를 해야하더라고요
그래서 뷰의 상태를 나타내는
RegisterStepenum을 State에 저장하고해당 상태(단계)가 바뀔 때마다 각 섹션을 다르게 그리거나
EmptyView()로 표시하게 구현했어요이렇게 단계를 enum으로 두고
예시로 메인 태그를 선택하는 섹션인데
switch문으로 UI가 표시되야아할 때, 표시되지 않아도 될 때를 구분해서 분기처리 했습니다CustomFlowLayout 구현
그 앱잼때 주영이가 구현했던
ChipButtonsContainerView를 사용하려고 했는데제 화면에서는 그 친구들이 위에 DropDown이 열리고 닫힘에 따라 같이 움직여야 하는데
GeometryReader기반이라서 애니메이션 적용이 안 되더라고요(좌표 계산 타이밍 때문에 그렇다고 합니다)
=> 그래서 찾아보니 커스텀으로
Layout을 구현하는 방법이 있어서 해보았습니다.코드가 좀 길긴 한데, 간단하게 설명하면
GeometryReader를 사용하지 않고Swift의
Layout프로토콜을 기반으로 작성했어요Layout 프로토콜을 채택하면 아래 두 함수를 필수로 구현해야합니다.
sizeThatFits()에서 계산한 크기 안에서 서브뷰들을 배치합니다CurrentX,CurrentY를 기준으로 셀들을 하나하나 배치해요.배치될 셀 너비를 계산하고
spacing값을 더한 값을 추가해 나가다가CurrentX값이 최대 너비를 넘어가려고 하면CurrentY를 다음 줄 위치로 증가시키고CurrentX를 다시 0으로 초기화하는 방식으로 셀을 배치합니다🔗 연결된 이슈
📚 참고자료
https://www.reddit.com/r/SwiftUI/comments/18pvz6g/recommended_swiftui_approach_to_creating_this/
https://developer.apple.com/documentation/swiftui/layout
👀 기타 더 이야기해볼 점
어제 솔커톤 고생했다 요플리들아~
좀 더 파이팅해봅시다