iOS

TexfField 시뮬레이터 버그 (Timeout)

GREEN.1229 2024. 3. 25. 18:41

안녕하세요. 그린입니다 🍏

이번 포스팅에서는 TextField 컴포넌트 사용 시 겪을 수 있는 시뮬레이터의 버그에 대해 알아보고 우회해보겠습니다 🙋🏻

 


어떤 버그!? 🐛

먼저 언제부터인지 모르겠지만, 포럼에 올라오거나 하는 글들을 살펴보니 Xcode 15, iOS 17로 올려서 시뮬레이터에서 텍스트필드 관련하여 테스트 시 버그가 있습니다.

실 디바이스에서는 발생하지 않는 문제로 아직 현 최신 Xcode에서도 버그가 수정되지 않은 부분으로 보입니다 😭

 

어떤 버그가 발생하는지 한번 보시죠!

 

간단하게 SwiftUI로 코드를 작성해볼께요.

 

import SwiftUI

...

private struct NameInputView: View {
  @Binding private var owner: String
  @Environment(\.dismiss) private var dismiss
  
  fileprivate init(owner: Binding<String>) {
    self._owner = owner
  }
  
  fileprivate var body: some View {
    VStack {
      TextField("대표자 이름을 써주세요!", text: $owner)
        .foregroundStyle(.white)
        .padding()
      
      Button("저장!") {
        dismiss()
      }
    }
    .padding(.all, 20)
  }
}

 

이러한 코드가 있다고 가정해봅니다.

핵심이 되는 TextField 사용을 하고 있는 부분만 볼께요.

평범한 구현과 마찬가지로 텍스트필드 컴포넌트를 사용하고 있습니다.

시뮬레이터에서 해당 텍스트필드에 포커싱을 하면 키보드가 올라오거나 아니면, 하드웨어 키보드를 사용하지 않고 직접 입력할 수 있는 방법으로 타이핑을 하죠.

 

그런데, 간혹 아래와 같이 디버그 콘솔에 경고 메시지가 나타납니다.

 

 

좀 작아서 안보일 수 있지만, 두 부각된 노란 음영 부분을 보시면, 타임아웃 관련 버그가 나타납니다.

런타임에서 앱이 터지는것은 아니지만, 실제로 해당 버그가 나타나면, 앱이 멈춰서 다른 동작을 할 수 없게 지장을 줍니다.

 

이유는 정확히 모르겠지만, 포럼들에 올라오는 간증들을 살펴보면 아직 시뮬레이터의 버그로 우회할수는 있다고 합니다.

 

그래서 한번 실제 앱이 멈추면 안되니 이 버그 메시지를 잡아보도록 할께요.


우회하는 방법

우선, 이 버그가 뜨는 이유라 추측되는것중 하나는 기본적으로 텍스트필드 컴포넌트 사용 시, 자동으로 단어를 추천해주는 제안 기능이 있습니다.

 

 

Df를 입력하면 이런식으로 관련 단어들을 제안하고 수정할 수 있죠.

이런것들을 많이 보셨고 익숙하실거에요.

수정된 텍스트에 대한 제안을 요청할때 타임아웃이 빈번하게 나타나더라구요.

매번 그런건 아니지만, 높은 확률로 초반 타임아웃을 잡아먹게 됩니다.

 

그렇기에, 우회하는 방법으로 이 제안을 사용하지 않는것입니다.

 

SwiftUI에서는 autocorrectionDisabled(_:) 메서드가 존재하여 텍스트필드 컴포넌트에서 사용할 수 있습니다.

 

TextField("대표자 이름을 써주세요!", text: $owner)
  .autocorrectionDisabled()

 

기본값이 true이기에 단순 호출만 해주면 되죠.

 

 

UIKit에서도 이 제안을 비활성화 해줄 수 있습니다.

 

import UIKit

let textField = UITextField(frame: CGRect(x: 0, y: 0, width: 100, height: 30))
textField.placeholder = "여기 입력!"
textField.autocorrectionType = .no

self.view.addSubview(textField)

 

autocorrectionType이라는 속성이 그 역할을 해줍니다.

단순히 no로 설정해주는것으로 수정된 제안 기능을 오프해줄 수 있죠.

 

이렇게 시뮬레이터에서 발생하는 버그를 우회할 수 있습니다.

 

다만 이제 타임아웃 에러는 찍히지 않지만, 텍스트필드 사용 시 여전히 아래 Session ID 관련 워닝 메시지는 나오더라구요.

 

이에 대해서도 포럼에서 많은 사람들이 겪고 있는데, 실제 시뮬레이터에서 앱이 동작할때 앱이 멈춰버리거나 키보드가 올라오지 않는 타임아웃 같은 체감할 수 있는 에러는 아니긴 하지만 여전히 메시지가 노출됩니다.

 

이것또한, 간증들에 의하면 Xcode 15 버전대에서 발생했고 아직도 수정되지 않았다고 하더라구요.

간혹, 포커싱이 가장 처음 발생할때 이 에러때문에 포커싱되는 속도가 느리다곤 합니다.

이에 대해서 아예 시뮬레이터에서 I/O 환경의 키보드 및 하드웨어 키보드 연결 옵션을 비활성화 처리해서 실제 시뮬레이터 테스트 시 시뮬레이터 키보드가 아닌 각자의 연결된 키보드로 사용하면 일단 테스트에서는 문제를 일으키지 않는다곤 합니다.

 

좋은 방법은 아니라 생각하지만....

엑코와 시뮬레이터 버그라니 어쩔수 없지 않나 생각이 드네요 🤔

 

결국 이렇게 우회하여 시뮬레이터에서 테스트를 해볼 수는 있었는데요.

아직 명확하게 어떤것이 원인이고 근본적으로 해결하는 방법에 대해서는 없는것 같았어요 🥲

만약 알고 계신분이 있다면 공유해주세요! ㅎㅎ

 


마무리

Xcode 업데이트를 꾸준히 해주시는 애플님들...

기존에 잘 작동하는것들에 대해 문제를 일으키지 않아주셨으면 하는 소망과 이런 소소한 버그들을 바로 잡으면서 업데이트 해주셨으면 합니다 🙏🏻

 


레퍼런스

 

autocorrectionDisabled(_:) | Apple Developer Documentation

Sets whether to disable autocorrection for this view.

developer.apple.com

 

 

autocorrectionType | Apple Developer Documentation

The autocorrection style for the text object.

developer.apple.com

 

 

iOS17 UITextView inputView becomFi… | Apple Developer Forums

In my case, it turned out to be a problem with the views getting recycled. I've implemented a TextField inside a ScrollView with LazyVStack in it, and when keyboard pops up, the scroll view shrinks and TextField leaves a rendering area and becomes unavaila

forums.developer.apple.com