UITableViewController와 UIViewController의 차이점
UITableViewController와 UIViewController는 iOS UIKit 프레임워크에 속한 서로 다른 두 객체로, 각각 다른 목적으로 사용됩니다.
UIViewController란?
UIViewController 클래스는 하나의 뷰 컨트롤러(View Controller)를 관리하며, 해당 뷰 컨트롤러 내에서 발생하는 동작을 담당합니다. 이 클래스는 viewDidLoad, viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear처럼 뷰 컨트롤러의 생명주기와 관련된 이벤트를 인식합니다.
UITableViewController란?
반면 UITableViewController는 UITableViewDataSource와 UITableViewDelegate를 사용하여 테이블과 그 데이터, 그리고 테이블에서 발생하는 각종 이벤트를 관리합니다.
즉, UITableViewController는 UIViewController, UITableViewDataSource, UITableViewDelegate를 모두 채택(conform)하여 테이블 뷰를 구현합니다.
다음은 UIViewController를 구현한 클래스의 예시입니다.
class ViewController : UIViewController {
@IBOutlet weak var sampleView: UIView!
override func viewDidLoad() {
}
}어떤 상황에서 무엇을 사용해야 할까?
UITableViewController 역시 UIViewController를 채택하고 있기 때문에 UIViewController의 메서드들도 함께 구현할 수 있습니다. UITableViewController는 주로 뷰 컨트롤러에 테이블 뷰 외에 다른 콘텐츠가 전혀 없을 때 사용하는 것이 적합합니다.
반대로 뷰 컨트롤러에 테이블 뷰와 함께 다른 UI 요소들이 포함되어 있다면, UIViewController를 채택한 뒤 UITableViewDataSource 프로토콜로 테이블에 데이터 소스를 연결하고, UITableViewDelegate 프로토콜로 테이블 뷰의 이벤트를 처리하는 방식이 일반적입니다.
UITableViewDataSource 또는 UITableViewDelegate를 구현한 UIViewController의 예시는 다음과 같습니다.
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate {
override func viewDidLoad() {
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//
}
}테이블 뷰의 기본 동작 특성
위 내용 외에도 테이블 뷰에는 다음과 같은 기본 동작 특성이 있습니다.
테이블 뷰가 화면에 나타나기 직전에는 자동으로 데이터를 다시 로드(reload)합니다.
테이블 뷰는 기본적으로 화면에 나타날 때 기존의 선택(selection)을 해제합니다.
테이블 뷰가 화면에 나타나는 순간 스크롤 인디케이터가 잠시 깜빡이며, 이 동작은 viewDidAppear() 메서드 내부에서 처리됩니다.