인프런 커뮤니티 질문&답변

gatewaykim님의 프로필 이미지

작성한 질문수

Part1: 진짜 왕초보 iOS 배우기(SwiftUI, SwiftData, 2024)

섹션2.끝말잇기앱 질문 - textfield 입력 변수 수정 방법

해결된 질문

24.06.06 19:02 작성

·

151

2

끝말잇기 앱을 만들다가 궁금증이 생겼습니다.

textfield 로 입력 받은 문자열을 수정해서 사용하고 싶을 때

(예: 사용자가 소문자로 입력한 영문자를 모두 대문자로 바꾸고 싶을 때)

어떻게 할 수 있나요?

 

입력받은 값을 저장한 변수를 건드리면 에러가 뜹니다.

 

즉,

nextWord = nextWord + "수정 더함"

해도 에러가 나고

다른 변수에 대입한 후 그 변수를 바꾸려 해도

(nextWord2 = nextWord + "수정")

에러가 납니다.

스크린샷 2024-06-06 오후 7.01.03.png스크린샷 2024-06-06 오후 7.02.03.png

 

답변 1

1

애구마(agmma)님의 프로필 이미지
애구마(agmma)
지식공유자

2024. 06. 06. 21:52

안녕하세요

gatewaykim님

현재 입력중인 TextField의 내용을 바꾸고 싶다면 .onChange 모디파이어를 사용하면 됩니다.

onChange는 특정 변수의 변화를 감지해서 해당 변수가 바뀔때마다 내부 내용을 실행시켜 줍니다.

아래와 같이 TextField 바로 밑에 .onChange를 쓰고 그 내부에 원하는 실행 동작을 넣으면 됩니다.

저는 nextWord = newValue.uppercased()를 넣어서 내부의 모든 글자를 대문자로 변경하는 로직을 넣었고요.

바로 밑에 주석으로 처리된거처럼 특정 글자를 더 더할 수도 있습니다.

 

강의 수강해주셔서 감사드리고, 유익한 수강되셨으면 좋겠습니다.

감사합니다!


import SwiftUI

struct ContentView: View {
    let title: String = "끝말잇기 게임"
    @State var nextWord: String = "aa"
    @State var nextWord2: String = ""
    @State var nextWord3: String = ""

    var body: some View {
        VStack {
            Text(title)
                .font(.title)
                .bold()
                .padding()
                .background(
                    RoundedRectangle(cornerRadius: 15)
                        .fill(Color.teal)
                        .opacity(0.2)
                        .shadow(radius: 5)
                )
                .padding(.top, 10)
            
            TextField("여기에 입력하세요", text: $nextWord)
                .onChange(of: nextWord) { newValue in
                    nextWord = newValue.uppercased() //입력된 글자 전부를 대문자로 바꿈
//                    nextWord = nextWord + " 수정"
                    nextWord3 = nextWord + " 새창의 입력 후 수정"
                }
                .padding()
                .background(
                    RoundedRectangle(cornerRadius: 15)
                        .stroke(lineWidth: 2)
                )
                .padding(.top, 10)
            
            Text(nextWord2)
            Text(nextWord3)

            Spacer()
        }
        .padding(.top, 10)
    }
}

#Preview {
    ContentView()
}
gatewaykim님의 프로필 이미지
gatewaykim
질문자

2024. 06. 08. 17:59

와~ 이렇게 간단하게 해결이 되네요

최고십니다~!!