비밀번호 입력화면 개발 & SwiftUI용 앵프라맹스 구현 내용 #116
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
개요
변경사항
enum
Stage &@FocusStatus
를 활용하여 TextField 전환 및 순서 로직 개발onReceive
모디파이어를 통한 Model의 Publisher 변화 -> 로직수행으로 개선Model
데이터 및 UI 상태들을 Model
내 지닐 수 있도록 개선하였다.@StateObject
를 사용하여@Published
변수들을 지녔다.@FocusState
,@Environment
만 View 내 위치한 형태로 개발하였다.View 내 @focusstate 와 Model 내 @published 값 간의 데이터흐름 고민
@FocusState
의 경우@StateObject
내 지니기엔 많은 문제가 발생하였다.따라서 고민 후 View 내 지닌채로 비즈니스 로직과 관련하여 Model 내 추가로 값을 지니며 이 둘간의
데이터 흐름
에 대해 고민하였다.@focusstate 값 변화 -> @published 값 반영
onChange
모디파이어를 통해 수신할 수 있었다.onChange
모디파이어 내에서model.updateFocus()
메소드를 통해@Published
값을 반영하였다.@FocusState
값만으로는 현재 진행중인 상태를 모두 설명할수는 없었기에 Model 내 추가적인stage
값을 지닌 형태로 구현하였다.@published 값 변화 -> @focusstate 값 반영
@Published
값이 변화된다..onReceive
모디파이어를 통해 publisher 값변화 수신할 수 있었다.@Published
값에 따라 분기처리하여@FocusState
값을 반영하였다.추가적인 에러상황
@FocusState
의 경우 publisher를 사용할 수 없는 형태였다.onChange
모디파이어를 통해 수신할 수 있었다.@FocusState 값을 동일하게 설정
한 경우에도onChange 모디파이어는 수신되지 않았다.
@Published
값 변화를 사용하여onReceive
모디파이어 내에서onChange
모디파이어 내중복되는 로직
이 필요할 수 밖에 없는 상황이 있었다.@FocusState
값을@StateObject
내에서 안전하게@Published
형태로 사용할 수 있다면 해결될 것 같지만, 현재로선 해당방법이 최선으로 보여진다.앵프라맹스 구현 내용
SecureField
와@FocusState
를 사용하면서 몇가지 이슈가 생겼었고, 이러한 것들을 각 앵프라맹스 목표별로 나열하겠다.화면에 진입시 자동으로 passwordTextField가 활성화되며 키보드가 표시된다.
onAppear
모디파이어 내에서@FocusState
값을 설정하여 키보드를 표시하였다.SecureField에 입력시 첫글자는 원문으로 보여야 한다.
SecureField
를 사용시 기본적으로 첫글자는 원문으로 보인다..onChange
모디파이어를 사용하여 text내용에 따른UI 분기처리
가 존재하는 경우첫글자가 원문으로 보이지 않는 현상
이 발생하였다..onChange
모디파이어를제거
하였고, text 내용에 따른 경고문 표시여부의 경우 model 내computed property
를 통해 해결하였다.SecureField 우측에 눈 아이콘을 통해 원문을 볼 수 있어야 한다.
SecureField
에서 원문을 표시할 수 있는 기능이 없었다.상태에 따라 TextField로 표시
되도록 구현하는것이 필요하였다.ZStack
내 TextField, SecureField를 넣었고,.opacity
를 통해 상황에 따라 표시되도록 구현하였다..opacity
를 사용하는 방법이@FocusState
로인한 문제가 발생하지 않는 유일한 방법으로 보였다..overlayShowButtonForSecureFieldView
모디파이어를 생성하여 적용하였다.SecureTextField 에 원문이 표시된채로 입력할 수 있어야 한다.
TextField
와SecureField
내 동일한$text
값을 사용하였다.opacity
로 인해SecureField
가 가려져도 입력된 값이TextField
로 표시가 되었다.SecureTextField 입력이 완료되면 secure 상태로 표시되어야 한다.
.onChange(of: focus)
모디파이어를 통해 비활성화 되었을 경우isSecure
값을 true로 설정하여 원문이 표시되지 않도록 하였다.키보드의 done 버튼을 눌러 다음 TextField로 이동한다.
.submitLabel
모디파이어와.onSubmit
모디파이어를 적용하여 done 버튼이 표시되도록 하였다.만약 정규식에 어긋나는 경우 TextField가 그대로 유지되며 text는 지워진채로 하단에 경고문이 표시되며 빨간색으로 표시되어야 한다.
model.checkPassword()
메소드가 실행된다.validPassword
값을 설정한다.validPassword
값이 false인 경우resetPassword2()
메소드가 실행되어 text가 지워지며 stage 값을 설정한다.resetPassword2()
메소드로 인해stage
값이 변경되면onReceive
모디파이어를 통해 수신받는다.@FocusState
값을.password
로 설정하여 TextField가 유지되도록 한다.TextField의 값이 입력되면 빨간색에서 파란색으로 변경되어 표시되어야 한다.
computed property
값인passwordTintColor
값 내에서 색을 반환한다.onChange
를 통해 text의 값 변경을 수신하여 UI를 표시하는 경우SecureField의 첫글자가 원문으로 표시되지 않는 문제
가 발생하였다.password.isEmpty
를 확인하는 식으로 구현하였다.비밀번호를 다시 변경하고자 TextField를 선택시 이후에 입력된 TextField는 초기화되며 사라져야 한다.
@FocusState
값이 변경된다.@FocusState
값의 변경을onChange
모디파이어를 통해 수신한다.model.updateFocus(to: focus)
메소드를 실행한다.updateFocus
메소드 내에서 선택된 focus 값에 따라stage
값을 변경하며, 이후에 입력된 데이터를 초기화한다.stage
값 변화로 인해 비밀번호 재입력 표시가 사라진다.아이패드의 경우 TextField 활성화에 따라 스크롤되어 화면에 가려지지 않도록 한다.
ScrollViewReader
,ScrollView
내 컨텐츠를 표시하는 식으로 구현하였다.@FocusState
값에 따라 scrollViewReader.scrollTo
모디파이어를 통해 스크롤되도록 구현하였다.id
값들을 부여하였다..padding
을 추가하여 정상적으로 스크롤이 이동되어 가려지지 않도록 구현하였다.#if targetEnvironment(macCatalyst)
분기처리가 추가되었다.아이패드의 경우 우측 여백을 통해 스크롤이 될 수 있도록 한다.
ScrollView
내HStack
을 표시하도록 하였다.HStack
내 VStack으로 표시되는 컨텐츠 양옆에Spacer()
를 추가하였다..frame(width: model.contentWidth)
로 width가 설정된 컨텐츠가 중앙에 표시되도록 하였다.최종적으로, 사용자는 키보드 입력과 done 버튼만으로 모든것을 할 수 있어야 한다.
model.checkPassword()
메소드가 실행된다.stage
값이 변화되어@FocusState
까지 변화되도록 구현하였다.또한 사용자가 선택한 TextField에 따라 초기화되어 표시되어야 한다.
@FocusState
값이 변화된다.@FocusState
값 변화를onChange
모디파이어를 통해 수신하여model.updateFocus()
메소드가 실행된다.stage
값이 변화되어 UI가 변화되어 표시되도록 구현하였다.@StateObject를 활용하여 Model 내 UI상태값들을 지닌 상태로 개발
@EnvironmentObject
,@FocusState
만 제외한 나머지 모든 값들을@Published
값으로@StateObject
내 지니도록 구현하였다.Reference