ios

[ios - Swift] RefreshControl 사용하기

POKY_0908 2020. 11. 22. 15:49

 

 

 

이번 시간에는 UITableView의 cell을 아래로 드래그 시 데이터를 Refresh 할 수 있도록 해보겠습니다. 

 

1. UIRefreshControl

사용자가 스크롤 가능한 콘텐츠 영역의 상단을 아래로 드래그하면 스크롤 뷰에 새로 고침 컨트롤이 표시되고 진행률 표시기에 애니메이션을 적용하고 앱에 알립니다.

let refreshControl = UIRefreshControl()

 

refreshControl.addTarget(self, action: #selector(refreshWork), for: .valueChanged)
mTableView.addSubview(refreshControl)

RefreshControl을 스크롤이 가능한 인터페이스에 Subview로 등록합니다.

 

selector: valueChage 발생 시 호출될 함수입니다.

for: 작업 메서드가 호출되는 컨트롤 관련 이벤트 비트 마스크입니다.

valueChange: 컨트롤을 드래그하거나 조작하여 일련의 다른 값을 방출하도록 하는 터치입니다.

 

 

 

@objc func refreshWork() {
   refreshControl.beginRefreshing()
   strArray.insert("New Data - 0", at: 0)
   strArray.insert("New Data - 1", at: 1)
   strArray.insert("New Data - 2", at: 2)
   strArray.insert("New Data - 3", at: 3)
   refreshControl.endRefreshing()
   mTableView.reloadData()
}

beginREfreshing, endRefreshing는 Refresh의 시작과 끝을 알립니다.

 

Refresh가 발생하면 StrArray에 새로고침 될 데이터를 등록하고 실행 결과를 보도록 하겠습니다.

 

 

 

 

아래는 전체 소스입니다.

class RefreshViewController: UIViewController {

    @IBOutlet weak var mTableView: UITableView!
    var strArray = Array<String>()
    let refreshControl = UIRefreshControl()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        for i in 0..<20 {
            strArray.append("Data Row - \(i)")
        }
        
        mTableView.delegate = self
        mTableView.dataSource = self
        
        refreshControl.addTarget(self, action: #selector(refreshWork), for: .valueChanged)
        mTableView.addSubview(refreshControl)
    }
    
    @objc func refreshWork() {
        refreshControl.beginRefreshing()
        
        strArray.insert("New Data - 0", at: 0)
        strArray.insert("New Data - 1", at: 1)
        strArray.insert("New Data - 2", at: 2)
        strArray.insert("New Data - 3", at: 3)
        
        refreshControl.endRefreshing()
        
        mTableView.reloadData()
    }
}

extension RefreshViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return strArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        
        cell.textLabel?.text = "\(strArray[indexPath.row])"
        
        return cell
    }
}