iyOmSd/Title: SwiftUI

[SwiftUI] @FocusState

냄수 2022. 10. 27. 22:00
반응형

iOS15+에서 지원되는 프로퍼티래퍼에요

 

포커스되는 상태를 관리할 수 있는 타입이에요

대표적으로 텍스트필드에서 자주쓰이죠

텍스트필드를

포커스했을때, 리턴했을때를 구분해야하는데

 

iOS15 미만에선

onCommit, onEditingChanged 를 통해서 관리했지만

 

iOS15+ 부터는

@FocusState와 onSubmit onChange를 이용해요

 

예시를 만들어봤어요


  
struct TextFieldTest: View {
@frozen
enum FocusType: Hashable {
case textfield1
case textfield2
}
@State private var text: String = ""
@FocusState private var focus: FocusType?
var body: some View {
VStack {
TextField("타이틀1", text: $text)
.submitLabel(.done)
.focused($focus, equals: .textfield1)
TextField("타이틀2", text: $text)
.focused($focus, equals: .textfield2)
}
// focus될때 실행됨(텍스트필드 클릭시)
.onChange(of: focus) { focusType in
guard let focusType = focusType else { return }
switch focusType {
case .textfield1:
print("위 텍스트필드")
case .textfield2:
print("아래 텍스트필드")
}
}
// 리턴버튼 클릭시 실행됨
.onSubmit {
guard let focus = focus else { return }
switch focus {
case .textfield1:
print("위 텍스트필드 리턴")
case .textfield2:
print("아래 텍스트필드 리턴")
}
}
}
}

FocusState값은 Hashable한 값이와야해요

enum으로 FocusState값이될 타입을 선언하고

focused()를통해서 각 텍스트필드마다 지정해줘요

그게 끝이에요

 

그리고 변화를 감지할땐

onSubmit - 리턴버튼 클릭시에 실행되는 구문

onChange - focusType이 텍스트필드가 포커스될때 변경되므로 여기서 관찰할수있죠 따라서 텍스트필드 포커스시 실행되는 구문이죠

 

 

반응형