๐Ÿ“‘ Project

[ Project ] WishListApp #5 / Pull to Refresh ์ ์šฉํ•˜๊ธฐ / UIRefreshControl

EarthSea 2024. 4. 17. 18:34

 

 

์˜ค๋Š˜์€ ๋ฉ”์ธํ™”๋ฉด๊ณผ TableView์— Pull to refresh ( ๋‹น๊ฒจ์„œ ์ƒˆ๋กœ๊ณ ์นจ ) ๋ฅผ ์ ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

UIRefreshControl

 

UIRefreshControl๋Š” Table View์™€ Collection View๊ฐ€ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋Š” UIScrollView์— ์—ฐ๊ฒฐํ•˜๋Š” ํ‘œ์ค€ Control์ž…๋‹ˆ๋‹ค. Content๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•  ์ˆ˜ ์žˆ๋Š” Control๋ฅผ ์ œ๊ณตํ•˜๋Š” object์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•œ Content ์˜์—ญ์„ ์•„๋ž˜๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด refresh control์ด ํ‘œ์‹œ๋˜๊ณ , progress indicator๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ™” ๋˜์–ด ์•ฑ์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด ์•Œ๋ฆผ์„ ์‚ฌ์šฉํ•ด content๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ refresh control์„ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Target-action ๋ฉ”์ปค๋‹ˆ์ฆ˜

UIRefreshControl์€ target-action ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ Content๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ธฐ๋ฅผ ์•Œ๋ ค์ฃผ๋Š”๋ฐ์š”! ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜์—ˆ์„ ๋•Œ, @objc๋กœ ๊ตฌ์„ฑ๋œ selector ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Content๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์™„๋ฃŒ๊ฐ€ ๋˜๋ฉด endRefreshing()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

 

func configureRefreshControl () {
   // Add the refresh control to your UIScrollView object.
   myScrollingView.refreshControl = UIRefreshControl()
   myScrollingView.refreshControl?.addTarget(self, action:
                                      #selector(handleRefreshControl),
                                      for: .valueChanged)
}
    
@objc func handleRefreshControl() {
   // Update your content…


   // Dismiss the refresh control.
   DispatchQueue.main.async {
      self.myScrollingView.refreshControl?.endRefreshing()
   }
}

์œ„๋Š” ์• ํ”Œ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณต๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค! ์œ„๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„ํ–ˆ์–ด์š”!

 

 

Main ํ™”๋ฉด์— UIRefreshControl ์ ์šฉํ•˜๊ธฐ

 

๋จผ์ € RefreshCotrol์„ ์„ค์ •ํ•ด ์ค„ ScrollView๋ฅผ VC๊ณผ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค!

@IBOutlet weak var scrollView: UIScrollView!

 

RefreshControl๋ฅผ ์„ค์ •ํ•  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ด๋ฆ„๊ณผ ๊ฐ’์ด ๋ณ€ํ™”๋˜์—ˆ์„ ๋•Œ, ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด ์ฃผ์—ˆ์–ด์š”!

override func viewDidLoad() {
    super.viewDidLoad()
    
    setRefreshControl()
}


// MARK: - refreshControl

func setRefreshControl() {
    scrollView.refreshControl = UIRefreshControl()
    scrollView.refreshControl?.attributedTitle = NSAttributedString(string: "Pull to refresh")
    scrollView.refreshControl?.addTarget(self,
                                         action: #selector(self.refresh(_:)),
                                         for: .valueChanged)
}

@objc func refresh(_ sender: AnyObject) {
    
    DispatchQueue.main.asyncAfter(deadline: .now()+1){
        self.setRandomID()
        self.setDataAndLabel()
        self.scrollView.refreshControl?.endRefreshing()
    }
}

 

 

์ƒˆ๋กœ๊ณ ์นจํ–ˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”๋˜๊ธฐ ์œ„ํ•ด์„œ randomID๋ฅผ ์ƒ์„ฑํ•˜๋Š” setRandomID ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ์ฃผ๊ณ  ํ•ด๋‹น data๋กœ ๋‹ค์‹œ UI๋ฅผ ๊ทธ๋ฆฌ๋Š” setDataAndLabel ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™”์‹œ์ผœ ์ค๋‹ˆ๋‹ค!

 

์ด๋•Œ, ์ƒˆ๋กœ๊ณ ์นจ ์ƒํƒœ๊ฐ€ ์ž ์‹œ ์œ ์ง€๋˜์—ˆ์œผ๋ฉด ํ•ด์„œ โญ๏ธ asyncAfter(deadline: (์‹œ๊ฐ„)) ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์„ 1์ดˆ ์ •๋„ ์œ ์ง€์‹œ์ผœ ์ฃผ์—ˆ์–ด์š”!

 

 

์‹คํ–‰ํ™”๋ฉด

 

 

 

 

 

TableViewController์— UIRefreshControl ์ ์šฉํ•˜๊ธฐ

 

TableViewController์—๋Š” ์ž์ฒด์ ์œผ๋กœ tableView๊ฐ€ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— VC์™€ ์—ฐ๊ฒฐ์„ ๋”ฐ๋กœ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค!

override func viewDidLoad() {
    super.viewDidLoad()
    setRefreshScroll()
}

func setRefreshScroll() {
    tableView.refreshControl = UIRefreshControl()
    tableView.refreshControl?.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)
}

@objc func refresh(_ sender: AnyObject) {
    DispatchQueue.main.asyncAfter(deadline: .now()+1) {
        self.tableView.refreshControl?.endRefreshing()
        self.tableView.reloadData()
    }
}

 

์œ„์™€ ๋˜‘๊ฐ™์ด ์ ์šฉํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

TableView์—๋Š” ๋”ฐ๋กœ attributedTitle๋ฅผ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค~!

๋˜ํ•œ TableView์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ tableView.reloadData()๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์—ˆ์–ด์š”!

 

์ €๋Š” ๋ถ„๋ช… endRefreshing()์„ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, refresh ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋ฐ˜๋ณต์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ  ๋ณด๋‹ˆ ์ œ๊ฐ€ .valueChanged ๋Œ€์‹ ์— .allEditingEvents๋ฅผ ๋„ฃ์–ด๋‘์—ˆ๋”๋ผ๊ตฌ์š”..ใ…Žใ…Ž

  • .valueChanged : ์‚ฌ์šฉ์ž๊ฐ€ ์ปจํŠธ๋กค์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋ฐœ์ƒ ( UIRefreshControl ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์„ ์•„๋ž˜๋กœ ๋“œ๋ž˜๊ทธํ•˜๋Š” ๋ชจ์…˜์ž์ฒด๊ฐ€ ์ปจํŠธ๋กค ๊ฐ’์ด ๋ณ€ํ™”๋œ ๊ฒƒ )
  • .allEditingEvent : textField๋‚˜ ๋‹ค๋ฅธ ์ž…๋ ฅ ํผ ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ํŽธ์ง‘ ๊ด€๋ จ ์ด๋ฒคํŠธ๋ฅผ ํฌ๊ด„ํ•จ ( ์• ์ดˆ์— UIRefreshControl๊ณผ๋Š” ๊ด€๋ จ์ด ์—†์–ด์„œ ๋ฌดํ•œ ์‹คํ–‰์ด ๋˜์—ˆ๋˜ ๊ฒƒ ) ์ฆ‰, ํ…์ŠคํŠธ ํŽธ์ง‘๊ณผ ๊ด€๋ จ๋œ ์ปจํŠธ๋กค์—์„œ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๊ฐ์ง€ํ•  ๋•Œ ์‚ฌ์šฉ

์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์ž˜ ํ™•์ธํ•˜์„ธ์š”!!

 

 

์‹คํ–‰ํ™”๋ฉด