저는 tableView의 Cell을 custom시에 따로 UITableViewCell 코코아터치 파일을 만들어서 커스텀합니다. 항상 의문이 드는 것은 awakeFromNib이라는 코드입니다.
제가 ViewController 내부의 전역변수로 cell에 접근하는 법을 명확하게 알지 못해 항상 tableView의 DataSource의 메소드 내부에서 indexPath를 통해 cell에 접근을 합니다. 그런데 이를 viewController의 ViewDidLoad()와 같이 view가 load되기 전에 cell 내부의 view들이 동작하도록 하고싶을 때가 있습니다. 그럴때마다 저는 viewDidLoad에서 접근을 하지 못해 awakeFromNib에서 동작을 시켜버립니다. (이는 우연찮게 넣어봤더니 동작이 되어서 이런 방식을 사용 중에 있습니다.) 이렇게 하는게 좋은 방법인지 모르고 그저 동작이 되니까 사용을 하고 있는데, 괜찮은 방법인지 의문이 들어 질문을 드립니다.
awakeFromNib자체가 원래 View가 로드되기 전 단계에서 실행되는 녀석으로 알고 있습니다. 작동이 된다면 마늘님 말대로 "view가 load되기 전에 cell 내부의 view들이 동작하도록 하고싶을 때"의 목적과 맞아서 작동하는 것 아닐까용? 괜찮은 방법인지는… 저도 잘 모르겠네요 도움이 못되서 죄송합니다 ㅠㅠ
XIB 혹은 Storyboard 를 통해서 View 인스턴스를 생성할 경우, 관련 init 메서드가 호출되지 않습니다.
(앗, 스위프트로 이야기 하면 생성자가 되겠군요. ㅎㅎ)
대신 메서드 명 그대로 인 awakeFromNib 가 호출되므로, 이 안에서 상황에 맞게 초기화를 하면 되겠습니다.
예를 들어, 커스텀 뷰를 만들기 위해, UIView 를 상속받는 클래스를 만든 상태에서, UI 구성은 xib 파일에서 만든 뒤, 이를 직접적으로 불러오는 케이스라면, UIView 의 initWithFrame: 이 호출되지 않기 때문에, 이 경우에는 awakeFromNib 에서 초기화를 하여야 합니다.
(가물가물하지만… awakeFromNib이 호출되는 경우, init 메서드 자체는 호출 되었던걸로 기억합니다…개인적으로는 이런 init 메서드들은 designated init 으로 가는게 맞다고 생각하고 있습니다…)
현재 tableViewController의 viewDidLoad에 breakPoint를 하나 잡고 그 내부에 있는 tableView의 DynamicCell 중 하나의 awakeFromNib에다가 breakdPoint를 걸어서 실행해본 결과 viewDidLoad()가 실행되고 난 후에 awakeFromNib이 실행이 되네요.
제가 awakeFromNib을 tableViewCell에서 말고 사용해본적이 없어 이렇게 테스트를 해봤는데 맞는 방법인지 모르겠네요 ㅎㅎ 좀 더 공부 후 다시 알아봐야겠습니다