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이 텍스트필드가 포커스될때 변경되므로 여기서 관찰할수있죠 따라서 텍스트필드 포커스시 실행되는 구문이죠

 

 

반응형