code-based tableView
진입점을 정한다, TabBarController
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// Set up the first View Controller 텝바 아이템1
let navigationItem1 = UINavigationController(rootViewController: FirstViewController())
navigationItem1.tabBarItem.image = UIImage(named: "텝바 아이콘1")
navigationItem1.tabBarItem.title = "테이블뷰"
// Set up the second View Controller 텝바 아이템2
let navigationItem2 = UINavigationController(rootViewController: SecondTableViewController())
navigationItem2.tabBarItem.title = "wishlist"
navigationItem2.tabBarItem.image = UIImage(named: "텝바 아이콘2")
// two items set in tabBarController 텝바에 두개의 아이템 셋팅
let tabBarController = UITabBarController() // 텝바 컨트롤러를 생성하고, 위에서 정의한 두개의 아이템을 연결한다.
tabBarController.viewControllers=[navigationItem1,navigationItem2]
window = UIWindow(windowScene: windowScene)
window?.rootViewController = tabBarController // 최상위 컨트롤러에 위에서 정의한 텝바 컨트롤러를 할당한다.
window?.backgroundColor = .systemBackground // 색상은 시스템 색상으로 한다
window?.makeKeyAndVisible()
}
tableViewController를 생성해서 올려도 되지만, ViewController를 생성해서 올리는 것이 활용 측면에서 더 광범위 한것 같다.
위 예제는 뷰컨트롤러를 생성한 후에 FirstViewController를 생성하고, 뷰 컨트롤러 위에 테이블 뷰를 생성했다.
TableViewController
테이블뷰와 테이블뷰에 뿌려줄 컨텐츠를 정의한다.
let myTableView: UITableView = UITableView()
let categoryLabel: [String] = [ "MAC", "IOS", "SWIFT"]
// 이미지를 연결할때는 Assets.xcassets 에 이미지 파일을 등록한 후에 사용할수 있다.
// 파일 이름은 영어로 하는 것이 좋다.
let categoryImages = [UIImage(named: "MAC"), UIImage(named: "IOS"), UIImage(named: "SWIFT")]
// delegate 연결
class DominoViewController: UIViewController{
// MARK: Properties
let myTableView: UITableView = UITableView()
// MARK: ViewController override method
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "해더 이름"
self.myTableView.dataSource = self
self.myTableView.delegate = self
}
}
extension DominoViewController: UITableViewDelegate {}
extension DominoViewController: UITableViewDataSource {
// UITableViewDataSource 프로토콜을 채택했기 때문에 아래 두개의 메서드는 필수로 추가 되어야 한다.
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.categoryLabel.count // row의 갯수
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell")! as UITableViewCell
cell.imageView?.image = categoryImages[indexPath.row] // Assets에 추가한 파일 이름의 이미지를 셋팅한다.
return cell // 셋팅된 셀을 반환한다.
}
}
// 해더와 해더
// viewDidLoad
let header = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 300))
let headerLabel = UILabel(frame: header.bounds)
headerLabel.text = "Header Label"
headerLabel.textAlignment = .center
header.addSubview(headerLabel)
myTableView.tableHeaderView = header
여러가지 방법이 있다.
//네이티브 오토레이아웃
//case 01
myTableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
myTableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
myTableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
myTableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
self.myTableView.register(UITableViewCell.self,
forCellReuseIdentifier: "TableViewCell")
// 위와 아래 코드는 동일한 코드이다.
//case 02
NSLayoutConstraint.activate([
myTableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
myTableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
myTableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
myTableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
])
self.myTableView.register(UITableViewCell.self,
forCellReuseIdentifier: "TableViewCell")
// 위와 아래 코드는 동일한 코드이다.
//case 03
self.myTableView.translatesAutoresizingMaskIntoConstraints = false // 뭐하는 애?
self.myTableView.register(UITableViewCell.self,
forCellReuseIdentifier: "TableViewCell")
self.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .top, relatedBy: .equal, toItem: self.view,
attribute: .top, multiplier: 1.0, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .bottom, relatedBy: .equal, toItem: self.view,
attribute: .bottom, multiplier: 1.0, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .leading, relatedBy: .equal, toItem: self.view,
attribute: .leading, multiplier: 1.0, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: self.myTableView,
attribute: .trailing, relatedBy: .equal, toItem: self.view,
attribute: .trailing, multiplier: 1.0, constant: 0))
```