-
SwiftUI TextEditor에 키보드 toolbar가 노출되지 않는 오류개발/Swift 2025. 4. 16. 16:31
ScrollView 내부에 두개의 TextEditor가있다
ScrollView { VStack(spacing: 0) { if case .post = store.contentType { TextEditor(text: $store.title.sending(\\.setTitle)) .focused($focusedField, equals: .title) .frame(minHeight: 30) .frame(maxWidth: .infinity) .font(.system(size: 18, weight: .bold)) .padding(.top, 24) } TextEditor(text: $store.content.sending(\\.setContent)) .focused($focusedField, equals: .content) .frame(minHeight: 160) .frame(maxWidth: .infinity) .font(.system(size: 16)) .padding(.top, 16) Spacer() }
입력을 다 마치고 만약 키보드를 내리고 싶을떄 어떻게할지 고민이 되었다.
- 전체영역의 대부분이 TextEditor을 사용하는 구조라서 전체영역에 tap gesture를 넣는것은 문제가 있었다.
부모뷰에 tapgesture를 넣고 editor영역 터치시에 editor focus를 준다했을때
에디터영역이 대부분이라 의미가 없었다.
- 키보드 줄넘김이 가능한 구조라 keyboard에 완료 버튼을 넣어 키보드를 내리는 동작을 넣기보다는
줄넘김으로 두는게 맞았다
3.그럼 결국 툴바를 사용하여 내리는 버튼을 추가해 주는것밖에 없었다.
.toolbar { ToolbarItemGroup(placement: .keyboard) { Spacer() Button { focusedField = nil } label: { Text("완료") } } }
툴바를 추가해줬는데 해당 툴바를 editor 마다 넣어주는게 아니라
감싼 VStack에 넣어줘도 둘다 적용이 되었다.
문제는 첫 키보드에서 툴바가 노출이 되지 않았다.
페이지 진입후 타이틀 editor 터치하여 키보드가 올라왔으나 툴바가 보이지 않았다.
그러나 두번째 editor가 포커스 된 이후부터는 툴바가 나오기 시작했다.
이유는 아무리 검색해봐도 알수없었고
결국은 SwiftUI 내부적으로 싱크문제가 있는것으로 판단되었다. (현재 iOS15 타겟)
따라서 한번 view 렌더링을 다시 해야
툴바가 적용되었음을 확인했다
onAppear 이후에 상태를 바꿔서 View렌더링을 다시했더니 처음부터 잘 노출되었다
.onAppear { store.send(.onAppear) // TCA 리듀서에서 상태변경 -> View 렌더링 }
'개발 > Swift' 카테고리의 다른 글
긴 text 내용이 minHeight에 잘리는 문제 (onAppear, task) (0) 2025.04.18 Observable → Async / Await 으로 변환하여 API 처리하기 (AsyncThrowingStream, withCheckedThrowingContinuation) (0) 2025.04.16 [Swift] 애니메이션 정지 재생 CGAffineTransform (0) 2025.04.11 UIKit SwiftUI에서 자동 스크롤 (0) 2025.04.08 WKWebview 에서 post 요청하는방법 (0) 2025.04.08