본문 바로가기
iOS와 그 외/UIKit

[iOS] TableViews - Static table views are only valid when embedded in UITableViewController instances 컴파일 오류

by lody.park 2024. 1. 7.

UIViewController 객체의 View 내부에 UITableView 객체를 Embed 하고

Attributes inspector 창을 통해 UITableView의 content를 static cell로 설정한 다음, 실행시켰는데

"Static table views are only valid when embedded in UITableViewController instances" 라는 오류가 발생하며 빌드에 실패했다.

 

원인을 찾고자 공식문서를 찾아보니...  아래와 같이 중요하다고 박스표시까지 되어있다.. UITableViewController

중요 ⚠️
정적 데이터를 가진 테이블 뷰는 해당 데이터를 관리하기 위해 UITableViewController 객체가 필요합니다.
정적 테이블을 사용하면 스토리보드 파일에서 테이블의 모든 데이터를 미리 지정하고, 데이터 소스 객체를 구현하지 않는다.
즉 데이터 소스를 통해 데이터를 관리하는 것이 아닌 런타임에 UIKit이 스토리보드에서 해당 데이터를 로드하여 관리한다.
런타임에 정적테이블의 데이터를 변경할 수 없으므로, 테이블 뷰의 내용을 업데이트할 가능성이 있다면 정적 데이터를 사용하면 안된다.
프로그래머는 정적 데이터가 포함된 테이블 뷰를 가진 UITableViewController에 데이터 소스 객체를 할당해서는 안된다. !!

 

https://developer.apple.com/documentation/uikit/views_and_controls/table_views/filling_a_table_with_data#3087462

 

 

정적 테이블 뷰는 섹션과 셀이 스토리보드에서 미리 정의되고 고정되어 있으며, 런타임에 변경되지 않는다. 이러한 정적 테이블 뷰는 UITableViewController와 함께 사용될 때 UIKit에 의해 자동으로 관리되고, 스토리보드에서 직접 셀을 구성할 수 있도록 해준다.

 

반면, 일반 UIViewController 내에서 UITableView 를 사용할 경우, 동적 테이블 뷰를 구현해야한다. 여기서는 프로그래밍 방식으로 데이터 소스를 관리하고, 셀을 동적으로 생성하며, 런타임에 데이터에 따라 테이블 뷰의 내용을 변경할 수 있다.

 

👉 요약하면, 정적 테이블 뷰UITableViewController 에서만 사용됨.!, 일반 UIViewController에서는 동적 테이블 뷰를 구현해야함.!!

 

참고:

https://developer.apple.com/documentation/uikit/views_and_controls/table_views/filling_a_table_with_data#3087462

 

Filling a table with data | Apple Developer Documentation

Create and configure cells for your table dynamically using a data source object, or provide them statically from your storyboard.

developer.apple.com


++ 추가: UIViewController 내부에서 UITableViewController를 컨테이너로 감싸서 사용하는 방법도 있긴한데 결국 Static Table View 는 UITableViewController를 써야만 한다는 말씀

https://sweetdev.tistory.com/98

 

[iOS] table view의 불편함 해결하기 : static table view를 그냥 view controller에 넣는 법

어케 해결할지 고민하다가 깃헙에 있는 글을 보고 따라해보기로 했다. The only way to get a static UITableView along with other controls on the same screen is to use a Container View. Follow this way, it works perfectly: Drag a View

sweetdev.tistory.com