[SwiftUI Preview error] unrecognized selector sent to instance

    Application Specific Information:        

CoreFoundation:            

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton lbText]: unrecognized selector sent to instance 0x1052ce370'

 

이 오류가 왜 나는지는 알고 있었다.

보통 swift 프로젝트에서 ObjC 라이브러리를 사용하게 되었을 때, other linker flag에 `-ObjC`를 추가 안 해 주면 해당 ObjC 파일을 스위프트 컴파일러가 찾지 못해 해당 오류가 발생하는 경우가 잦다.

 

하지만? 이번에는 그런 경우는 아니었따 . . . . . .

왜냠 빌드는 잘 되는데 SwiftUI Preview에서만 발생하는 문제였기 때문이다.

 

그럼 빌드와 SwiftUI Preview가 둘이 뭔가 다르기 때문에 발생하는 거 아닐까!??!?!?! 하고 찾아보니 ... ...

 

Preview 빌드 시 필요한 최소한의 파일만 컴파일하기 때문에 생긴 문제였다.

관련해서 자료를 찾아봐도 나랑 영 안 맞은 얘기만 해서 많이 헤맸는데 그래도 해결해따.

일단 상황은 이러했다.

1. UIViewController에서 objc library 사용
2. objc Library에서 AButton이라는 UIButton을 상속받은 클래스가 있었는데, 해당 클래스에는 lbText 변수가 존재함
    부가설명을 하자면, 해당 Button은 코드 내에서 선언된 부분 없이 xib에서 class로 연결되어 있었다.
3. 해당 ViewController를 UIViewControllerRepresentable로 선언
4. ContentView에 불러옴
5. 해당 ViewController를 불러오게 되면 위와 같은 오류가 나면서 Preview Crash가 발생했다.

 

library 내의 다른 소스를 사용하는 건 잘 불러오는 걸 보면 objc 코드나 library가 문제가 있는 것은 아니었다.
그럼 SwiftUI의 preview 동작 방식을 생각해 보아야 한다.

SwiftUI의 preview는 최소한의 리소스를 써서 특정 화면만 보여주는 것을 목적으로 한다.
따라서, 해당 viewController를 불러올 때 명시적으로 선언되어 있지 않은 (xib에서는 연결되어 있기는 하지만) AButton을 빼고 컴파일하고 있는 거 아닐까? 라는 가설을 세웠고
별 다른 것 없이 AButton class를 init 하는 구문을 하나 넣어주었다.

... ... 놀랍게도 해결되었다!
이렇게 허무할수가~

 

AButton을 VC 내에 init 하지 않고 어떻게 preview에서 보이게 할 수 있는지 알고 싶은데 그건 조금 더 찾아봐야 할 것 같다 ㄱ-

참나.. 

예상이 맞아서 기쁘지만 완벽하게 해결한 건 아니라 죄금 찝찝하다

더 찾아봐야지

이후에 다른 방법을 찾으면 아래로 추가하겠음

'iOS > App' 카테고리의 다른 글

XCTestCase  (2) 2024.09.17
[iOS] Privacy Manifest  (2) 2024.03.25
[iOS] 앱의 생명 주기(App's Life Cycle)  (0) 2024.01.30
[SwiftUI] Widget Padding 없애기  (0) 2024.01.07
[iOS] Share 기능 구현하기 +) 메타데이터?  (1) 2023.12.24