Conversation
There was a problem hiding this comment.
확인했습니다 !
닉네임, 소개글 부분은 수정이 잘 된 것 같아요. 코드 로직적인 부분에 대한 질문 남겼으니 확인 부탁드립니다.
근데 장르 선택 부분이 아직 로직이 완성되진 않은 것 같아서요!
이미 선택된 장르를 눌러 deselected하고 다시 selected하면 완료 버튼이 활성화됩니다!
해당 로직 다시 한번 확인해주심 감사하겠습니다!
추가적으로, UI 관련 수정사항은 앞으로 PR 디스크립션 시뮬레이션 이미지나 GIF, 영상 캡쳐해서 넣어주심 수월하게 코드리뷰 가능할 것 같습니다. 또한, 로직이 추가되었을 때 변경사항을 명시해주심 감사하겠습니다!
| } | ||
|
|
||
| introTextView.do { | ||
| $0.font = .Body2 |
There was a problem hiding this comment.
아래 bindData 함수에서 이미 applyWSSFont 함수를 통해 폰트 적용중이므로,
해당 코드 제외해도 좋을 것 같습니다!
|
|
||
| rootView.introTextView.delegate = self |
There was a problem hiding this comment.
위 델리게이트 설정과 동일하게 rx delegate로 설정하시죠!
There was a problem hiding this comment.
@Guryss
rx delegate 처음이라 쓰던 습관처럼 써버렸네용
컨벤션은 작업하면서 계속 익숙해져볼게요!
수정 완료
| // 변경될 텍스트의 실제 렌더링 높이 계산해서 3줄 일 때 최대 높이(maxHeight)를 초과하게 되면 더 써지지 않도록 함 | ||
| let size = CGSize(width: textView.textContainer.size.width, height: .infinity) | ||
| let boundingRect = (updatedText as NSString).boundingRect( | ||
| with: size, | ||
| options: [.usesLineFragmentOrigin, .usesFontLeading], | ||
| attributes: [.font: textView.font as Any], | ||
| context: nil | ||
| ) |
There was a problem hiding this comment.
아하... 텍스트 높이로 계산해서 3줄이 넘어가지 않게 계산한것이군요!
코드 의도가 궁금하긴 합니다만 ...
There was a problem hiding this comment.
@Guryss
예전에.. 개인앱 했을 때도 사용하는 폰트가 고정되어 있어서 그 계산값으로 줄 제한을 한 적이 있는데 소소에도 당시 사용한 방식을 그대로 사용한 의도긴 한데요...
처음엔 \n으로 줄바꿈을 인식할까도 고민했는데 이 방식은 텍스트가 너무 길어져서 자동으로 다음 줄로 넘어갔을 때를 감지하지 못해서 한 줄의 높이를 계산해 3줄 일 때 최대 높이를 계산하게끔 했습니당.
boundingRect로 실제 차지할 높이를 미리 계산해서 제한시킬 수 있어서 사용했어요
혹시 다른 좋은 방식이 있으면 말씀해주시면 감사하겠습니닷!
| let textViewBeginEditing: ControlEvent<Void> | ||
|
|
||
| let genreCellTap: ControlEvent<IndexPath> | ||
| let genreCellTap: Observable<IndexPath> |
There was a problem hiding this comment.
해당 부분은 우선 이번에 장르 선택 셀 선택/해제 이벤트를 정상적으로 처리하기 위해 코드 수정하면서 같이 수정하게 되었습니다
// 수정 전
genreCellTap: rootView.genreCollectionView.rx.itemSelected
// 수정 후
genreCellTap: Observable.merge(
rootView.genreCollectionView.rx.itemSelected.asObservable(),
rootView.genreCollectionView.rx.itemDeselected.asObservable()
)장르 선택/해제 이벤트를 모두 처리하기 위해 Observable.merge를 사용했고, merge의 리턴 타입이 Observable이라 ViewModel Input 타입도 ControlEvent에서 Observable로 변경했습니다!
|
|
||
| output.nicknameText | ||
| .bind(with: self, onNext: { owner, text in | ||
| owner.rootView.nicknameTextField.text = text |
There was a problem hiding this comment.
nicknameText를 다시 textField에 bind해주신 이유가 궁금합니다!
현재 구조에서는 textField → ViewModel 흐름만으로도 동작하는 것 같아서요.
따로 뷰모델에서 가공된 값을 다시 UI에 전달하는 과정이 없는 걸 봐선 없어도 될 것 같습니다
There was a problem hiding this comment.
해당 로직이 없으면 닉네임의 x 표시를 눌렀을 때 "" 빈 값이 UI에 업데이트가 되지 않습니다!
현재는 단순하게 텍스트필드에 rx.text를 활용해 전달하는 것 같은데 UI를 자동으로 변경해주지는 않는다고 합니당
Simulator.Screen.Recording.-.iPhone.17.Pro.-.2026-03-26.at.18.52.04.mov |
|
|
|
||
| output.nicknameText | ||
| .bind(with: self, onNext: { owner, text in | ||
| owner.rootView.nicknameTextField.text = text |
| // 변경될 텍스트의 실제 렌더링 높이 계산해서 3줄 일 때 최대 높이(maxHeight)를 초과하게 되면 더 써지지 않도록 함 | ||
| let size = CGSize(width: textView.textContainer.size.width, height: .infinity) | ||
| let boundingRect = (updatedText as NSString).boundingRect( | ||
| with: size, | ||
| options: [.usesLineFragmentOrigin, .usesFontLeading], | ||
| attributes: [.font: textView.font as Any], | ||
| context: nil | ||
| ) |
| let textViewBeginEditing: ControlEvent<Void> | ||
|
|
||
| let genreCellTap: ControlEvent<IndexPath> | ||
| let genreCellTap: Observable<IndexPath> |
|
심사 일정으로 인해 제가 머지하겠습니다~ |
- 예시: 로판, 판타지, 현판 != 현판, 로판, 판타지로 인식
- bindData에서 설정 중
- 위 rx delegate와 동일한 방식으로 설정
⭐️Issue
🌟Motivation
🌟Key Changes
🌟Simulation
🌟To Reviewer
동작 확인을 한번씩 하긴 했는데 한번 더 확인 부탁드려용
🌟Reference