UITableView separatorStyle 적용 문제

쑤야·2022년 9월 19일
0

Problem

  • UITableView 인스턴스에 custom separator을 적용하기 위해 기본으로 제공되는 separator 제거 필요한 상황
  • separatorStyle을 .none 값으로 할당함
    tableView.separatorStyle = .none
  • 위와 같이 none으로 설정한 separatorStyle이 적용되지 않은 것을 볼 수 있음

프로젝트를 진행하면서 실제 경험담인데, viewController에 모든 UI를 때려넣었을 때 전역 변수로 UITableViewCell 프로퍼티를 선언과 동시에 초기화를 진행할 때 separatorStyle을 지정하면 반영되지 않는 것을 확인할 수 있었음. 그 당시에는 dataSource와 delegate를 viewDidLoad에서 설정을 해줘야 했기 때문에 전역 변수로 프로퍼티를 선언만 해주고 viewDidLoad에서 초기화를 진행했었다.

지금은 View 파일과 ViewController를 분리하고 View에서 모든 UI를 구현하기 때문에 프로퍼티를 선언과 동시에 초기화를 진행한 것이었는데 결론적으로는 separatorStyle가 viewDidLoad에서 초기화되지 않아 발생하는 문제였던 것이었다.

Solution and Apply

  • ViewController 파일에서 프로젝트에서 사용되는 모든 UITableView의 프로퍼티 delegate, dataSource, separatoryStyle를 항상 설정해줘야 함
  1. UITableView extension 파일을 만들어 동시에 설정해줄 수 있도록 구현
func settingCustomTableView(_ viewController: UIViewController){
        self.dataSource = viewController as! UITableViewDataSource
        self.delegate = viewController as! UITableViewDelegate
        self.separatorStyle = .none
}
  1. UITableView의 나머지 초기화(register, scroll, scrollIndicator 등)는 사용되는 View마다 설정이 달라지기 때문에 View 파일에서 진행하도록 하였으며, ViewController의 부담을 줄여줬다
class SettingView: UIView {

    let tableView = UITableView().then{
        $0.showsVerticalScrollIndicator = false
        $0.isScrollEnabled = false
        
        $0.register(AlarmSettingTableViewCell.self, forCellReuseIdentifier: AlarmSettingTableViewCell.cellIdentifier)
        $0.register(DefaultSettingTableViewCell.self, forCellReuseIdentifier: DefaultSettingTableViewCell.cellIdentifier)
        $0.register(SettingTitleTableViewCell.self, forCellReuseIdentifier: SettingTitleTableViewCell.cellIdentifier)
        $0.register(SettingBorderLineTableViewCell.self, forCellReuseIdentifier: SettingBorderLineTableViewCell.cellIdentifier)
    }
		
		...
}
  1. 사용은 ViewController 파일의 viewDidLoad 메서드에서 이렇게만 선언해주면 된다
mainView.tableView.settingCustomTableView(self)

Result

  • View 파일에서 UITableView를 선언과 동시에 초기화할 수 있게 됨
    • 선언과 동시에 초기화할 수 있는 프로퍼티만 View에서 설정할 수 있도록 남겨놨기 때문
  • ViewController에서 UITableView 설정을 공통 소스를 통해 설정함으로써 편리함 높임
profile
CE 20

0개의 댓글