cleanUrl: /programming/debugging/ibdesignable-crash

IBDesignable은 xib파일에서 작업한 결과물을 다른 xib나 스토리보드에서 바로바로 확인 할 수 있게 해주는 편리한 툴입니다. 기본적인 사용법은 이 포스트를 참조해주세요.

하지만 안타깝게도, IBDesignable을 사용했을 때 주의하지 않으면 다음과 같은 에러들을 만나게 되기도 합니다.

IBDesignable Crash가 발생해, 인터페이스 빌더에서 아무 것도 “보면서 편집” 할 수 없는 상황입니다.

1TV8Hs7qYkXOZg90TlB_KqA.png

이런 에러를 만났을 때 제대로 대처하지 못한다면, IBDesignable은 그저 생산성을 저하시키는 툴밖에 되지 않겠죠. 이 글에서는 IBDesignable을 사용하면서 만날 수 있는 에러 메시지들과, 그에 대한 대처법, 주의할 사항을 알아보도록 하겠습니다.

들어가기 전에, 간단한 배경지식

InterfaceBuilder는 iOS Simulator위에서 돌아간다.

IB는 결코 정적인 그림판이 아닙니다. 그것은 실시간으로 돌아가고 있는 Simulator의 화면입니다. 우리가 직접 Command+B를 눌러서 빌드를 하지 않아도, Xcode를 키거나 IB 파일을 열었을 때 Xcode에서 빌드가 돌아가는 이유가 바로 그 때문이죠.

그리고 Simulator는 우리가 Command+R을 눌렀을 때 앱이 올라가는 시뮬레이터와는 별도의 시뮬레이터일 수 있고, 만들어지는 Bundle도 다른 Bundle일 수 있습니다. 이 점만 기억하면 아래의 여러 에러들을 훨씬 쉽게 이해하고 다룰 수 있습니다.

ErrorMessage 1 : Agent Crash

IBDesignables: Failed to update auto layout status: The agent crashed

이런 종류의 메시지가 떴다면, 이는 운이 좋은 경우입니다. IBDeignable을 렌더링하던 시뮬레이터에서 크래시가 발생했기 때문에, 그 크래시 로그가 남게 되고, 그 로그를 분석하면 어디서 문제가 발생했는지 알 수 있기 때문입니다.

cd ~/Library/Logs/DiagnosticReports
ls | grep ‘IBDesignablesAgent-iOS*’ // 이 결과 물 중 가장 최근 파일을 연다.

 // 혹은 아예 이 명령을 shellScript로 만들 수도 있습니다.
ls ~/Library/Logs/DiagnosticReports | grep ‘IBDesignablesAgent-iOS*’| tail -1 | xargs open

위 명령을 치면 다음과 같은 크래시 로그를 볼 수 있습니다.

1kBMq3Ui65jdsu0shHIabow.png

친절하게도 어떤 파일의 어떤 함수에서 어떤 오류가 발생했는지 상세히 알려줍니다.

기본적으로 IB는 파일의 awakeFromNibprepareForInterfaceBuilder 를 실행합니다. 따라서 사실 굳이 크래시 로그를 보지 않더라도, 대부분의 오류는 그 두 군데를 잘 살펴보면 알아낼 수 있습니다. 그리고 사실 그 두 군데에서 크래시를 유발 할 수 있는 실수들도 어느 정도 정해져 있습니다.

1. Bundle.main에서 Asset을 불러오거나 그것을 참조한다.

우리에게 main인 번들이 IB simulator에게는 main이 아닐 수도 있습니다. 따라서 우리가 AssetCatalogue에 넣어둔 Asset들이 IB simulator에서는 nil이 될 수도 있지요. 언제나 Bundle.main을 직접 부르지 말고 Bundle(for: MyViewClass.self)를 통해 Bundler을 참조해야 합니다. 무엇보다도 force-unwrapping은 그냥 전체적으로 하지 않는 것이 좋습니다.