awakeFromNib은 어떤 용도인가요?

저는 tableView의 Cell을 custom시에 따로 UITableViewCell 코코아터치 파일을 만들어서 커스텀합니다. 항상 의문이 드는 것은 awakeFromNib이라는 코드입니다.

제가 ViewController 내부의 전역변수로 cell에 접근하는 법을 명확하게 알지 못해 항상 tableView의 DataSource의 메소드 내부에서 indexPath를 통해 cell에 접근을 합니다. 그런데 이를 viewController의 ViewDidLoad()와 같이 view가 load되기 전에 cell 내부의 view들이 동작하도록 하고싶을 때가 있습니다. 그럴때마다 저는 viewDidLoad에서 접근을 하지 못해 awakeFromNib에서 동작을 시켜버립니다. (이는 우연찮게 넣어봤더니 동작이 되어서 이런 방식을 사용 중에 있습니다.) 이렇게 하는게 좋은 방법인지 모르고 그저 동작이 되니까 사용을 하고 있는데, 괜찮은 방법인지 의문이 들어 질문을 드립니다.

p.s 혹시 nib은 xib파일을 통해 cell을 커스텀할때만 사용되는 그런 것일까요?

좋아요 1

awakeFromNib자체가 원래 View가 로드되기 전 단계에서 실행되는 녀석으로 알고 있습니다. 작동이 된다면 마늘님 말대로 "view가 load되기 전에 cell 내부의 view들이 동작하도록 하고싶을 때"의 목적과 맞아서 작동하는 것 아닐까용? 괜찮은 방법인지는… 저도 잘 모르겠네요 도움이 못되서 죄송합니다 ㅠㅠ

글고 nib와 xib는 저는 UIView를 상속받고 커스텀하는 용도로 이해하고 있습니다

참고하시라고 (이미 보셨을 수도 있지만)링크 하나 남깁니당

xib를 사용한 UIView Custom 제대로 이해하기: XIB를 사용한 UIView Custom 제대로 이해하기. #iOS #XIB #UIView #Custom | by whitelips | a day of a programmer | Medium

nib와 xib의 차이: iOS ) nib과 xib의 차이

좋아요 3

답변 감사드립니다

@dragonhead님께서 보내주신 링크 모두 여러번 읽어봤지만 아직 부족한 저로서는 그저 검은색 글씨일 뿐이네요 ㅎㅎ

제가 nib과 xib에 대해서 잘 모르다보니 apple document awakeFromNib 항목을 해석하는데서 어려움을 겪어 질문을 드리게 되었습니다. 한 번 공부해서 포럼에 올려봐야겠습니다. 물론 xib로 테이블 뷰도 커스텀해서요!

좋아요 2

XIB 혹은 Storyboard 를 통해서 View 인스턴스를 생성할 경우, 관련 init 메서드가 호출되지 않습니다.
(앗, 스위프트로 이야기 하면 생성자가 되겠군요. ㅎㅎ)

대신 메서드 명 그대로 인 awakeFromNib 가 호출되므로, 이 안에서 상황에 맞게 초기화를 하면 되겠습니다.

예를 들어, 커스텀 뷰를 만들기 위해, UIView 를 상속받는 클래스를 만든 상태에서, UI 구성은 xib 파일에서 만든 뒤, 이를 직접적으로 불러오는 케이스라면, UIView 의 initWithFrame: 이 호출되지 않기 때문에, 이 경우에는 awakeFromNib 에서 초기화를 하여야 합니다.

(가물가물하지만… awakeFromNib이 호출되는 경우, init 메서드 자체는 호출 되었던걸로 기억합니다…개인적으로는 이런 init 메서드들은 designated init 으로 가는게 맞다고 생각하고 있습니다…)

도움이 되시려는지 모르겠습니다. :smile:

좋아요 2

오호! storyboard를 통해서 view 인스턴스르 생성시에 awakeFromNib 메소드가 호출되는군요! 처음 알게된 사실입니다 ㅎㅎ

그럼 awakeFromNib은 viewDidLoad()가 호출되기 전에 더 먼저 호출되는 것일까요?

좋아요 1

ViewController 와 View 의 관계에서 유추해보면 viewDidLoad() 호출 전이 의미상 맞지 않을까 싶네요. :smile:

가볍게 테스트 후 결과 올려주시면 더 좋겠습니다. ㅎㅎ

좋아요 2

현재 tableViewController의 viewDidLoad에 breakPoint를 하나 잡고 그 내부에 있는 tableView의 DynamicCell 중 하나의 awakeFromNib에다가 breakdPoint를 걸어서 실행해본 결과 viewDidLoad()가 실행되고 난 후에 awakeFromNib이 실행이 되네요.

제가 awakeFromNib을 tableViewCell에서 말고 사용해본적이 없어 이렇게 테스트를 해봤는데 맞는 방법인지 모르겠네요 ㅎㅎ 좀 더 공부 후 다시 알아봐야겠습니다

좋아요 2

TableView DataSource 라면, 타이밍 기준에서 이미 UITableViewController 의 viewDidLoad 가 지나간 다음이 되겠네요. :smile:

delegate pattern 이 그 이후에 동작하게 될꺼니까…

viewDidLoad → UITableView ->> DataSource Trigger → dequeuing from TableView cache ->> load instance with UX from storyboard → awakeFromNib called

정도의 흐름이 되지 않을까요? :smile:

좋아요 3

알려주신 흐름을 모두 이해하지는 못했지만 어떤 순서로 작동하는지 감이 조금은 잡힌 것 같습니다. 좋은 답변 감사합니다!

좋아요 2

이번 기회에

loadView
viewDidLoad
awakeFramNib
viewWillAppear
ViewDidAppear
에 대해 정리를 한 번 해 주시죠!

좋아요 1

크흠크흠… 부족한 실력이지만 한 번 작성해보겠습니다

좋아요 1