Swift 텝바 컨트롤러, 테이블뷰(2020.11.23)

K S Michael·2020년 11월 22일

swift TIL

목록 보기
28/29

code-based tableView

sceneDelegate

진입점을 정한다, 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를 생성하고, 뷰 컨트롤러 위에 테이블 뷰를 생성했다.


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))
              ```
profile
차근차근

0개의 댓글