티스토리 뷰

TableView를 이용해서 구현해보게씸더.

xib를 이용해서 테이블뷰 하나를 만들어줍니다. (원래 만들던 방식으로..!)

거기서

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    
    var dataList : [String] = ["가","나","다","라","마"]
    
    let refreshControl = UIRefreshControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        registerXib()
        assignDelegate()
        initRefresh()
    }
    
    func initRefresh() {
        refreshControl.addTarget(self, action: #selector(refreshTable(refresh:)), for: .valueChanged)
        
        refreshControl.backgroundColor = .yellow
        refreshControl.tintColor = .purple
        refreshControl.attributedTitle = NSAttributedString(string: "당겨서 새로고침")
        
        tableView.refreshControl = refreshControl
    }
    
    @objc func refreshTable(refresh: UIRefreshControl) {
        print("새로고침 시작")
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.tableView.reloadData()
            refresh.endRefreshing()
        }
    }
    private func registerXib() {
        let nibName = UINib(nibName: "TableViewCell", bundle: nil)
        tableView.register(nibName, forCellReuseIdentifier: "TableViewCell")
    }
    
    private func assignDelegate() {
        tableView.delegate = self
        tableView.dataSource = self
    }
}

extension ViewController: UITableViewDelegate {
    
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataList.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let tableCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier) as? TableViewCell else {return UITableViewCell()}
        
        tableCell.setData(title: dataList[indexPath.row])
        
        return tableCell
    }
}

우선 이게 전체 코드이고 하나하나씩 뜯어 볼게요 ..! (위 코드는 뷰컨 코드입니다!)

let refreshControl = UIRefreshControl()

UIRefreshControl 인스턴스를 하나 생성해줍니다.

 func initRefresh() {
        refreshControl.addTarget(self, action: #selector(refreshTable(refresh:)), for: .valueChanged)
        
        refreshControl.backgroundColor = .yellow
        refreshControl.tintColor = .purple
        refreshControl.attributedTitle = NSAttributedString(string: "당겨서 새로고침")
        
        tableView.refreshControl = refreshControl
    }

처음 생성해준 refresgControl이 값이 바뀔 때, 동작할 때 (valueChanged) : 어떤 함수가 동작할지 #selector 안에 넣어줘서

addTarget을 매칭해준다. 

그리고 이렇게 타겟 지정된 refreshControl 을 tableView의 refrehControl 지정한다.

 @objc func refreshTable(refresh: UIRefreshControl) {
        print("새로고침 시작")
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.tableView.reloadData()
            refresh.endRefreshing()
        }
    }

refreshControl이 동작했을 때, 어떤 함수가 실행될지에 대한 부분이다.

해당 DispatchQueue를 통해 현재로부터 새로고침을 중단하는 부분이다.

실제 프로젝트라면 딜레이가 걸리는 동안 서버 통신을 진행하고, 서버에서 받아온 데이터를 바탕으로

table을 다시 그려주면,, ! (예시로 1초만 걸어둠)

   override func viewDidLoad() {
        super.viewDidLoad()
        registerXib()
        assignDelegate()
        initRefresh()
    }

initRefresh() 함수를 viewDidLoad() 에서 호출 ! 

 

추가적으로 알게된 점 : 

refreshControl 커스텀이 가능하다는 점? 

backgroundColor 통해 배경색, tintColor 통해 refreshControl의 색을 attributedTitle을 통해 텍스트를 넣어서 변경 가능 !

또한 기본형태가 아니라 애니메이션이나 모양을 추가할 수 있다 ! (앞에서 다뤘던 Lottie)

 

'Sopt 28th 세미나 - iOS' 카테고리의 다른 글

[Swift] Encode / Decode  (0) 2021.08.19
[Swift] Animation  (0) 2021.08.16
[Swift] Activity Indicator & Lottie  (0) 2021.08.16
[Swift] TableView 개념  (0) 2021.08.14
[Swift] 데이터 전달  (0) 2021.08.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함