source

Swift에서 pull을 사용하여 새로 고치는 방법

ittop 2023. 4. 22. 10:29
반응형

Swift에서 pull을 사용하여 새로 고치는 방법

swift를 사용하여 RSS 리더를 구축하고 있으며 새로고침 기능을 구현해야 합니다.

이것이 내가 그것을 하려고 하는 방법이다.

class FirstViewController: UIViewController,
    UITableViewDelegate, UITableViewDataSource {

   @IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
   @IBOutlet var newsCollect: UITableView

   var activityIndicator:UIActivityIndicatorView? = nil

   override func viewDidLoad() {
       super.viewDidLoad()
       self.newsCollect.scrollEnabled = true
      // Do any additional setup after loading the view, typically from a nib.

      if nCollect.news.count <= 2{
          self.collectNews()
       }
      else{
          self.removeActivityIndicator()
       }
      view.addGestureRecognizer(refresh)
   }



@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
    nCollect.news = News[]()
    return newsCollect.reloadData()
}

다음 정보를 얻을 수 있습니다.

super.init 호출 시 속성 'self.refresh'가 초기화되지 않았습니다.

제스처 인식자의 행동을 이해할 수 있도록 도와주세요.샘플 코드를 사용하면 도움이 됩니다.

감사해요.

iOS에는 풀 투 리프레쉬 기능이 내장되어 있습니다.이렇게 빨리 할 수 있어요.

let refreshControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
   tableView.addSubview(refreshControl) // not required when using UITableViewController
}

@objc func refresh(_ sender: AnyObject) {
   // Code to refresh table view  
}

어느 시점에서 리프레쉬를 종료할 수 있습니다.

refreshControl.endRefreshing()

스토리보드와 Swift를 갖춘 솔루션:

  1. .storyboard 파일을 열고 스토리보드에서 TableViewController를 선택하고 유틸리티에서 TableViewController: Refresh 기능을 "활성화"합니다.

    인스펙터

  2. 있는 것을 .UITableViewController 5 을 Swift 5에 합니다.viewDidLoad★★★★★★ 。

    self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
    
  3. viewDidLoad 메서드 위에 다음 메서드를 추가합니다.

    func refresh(sender:AnyObject)
    {
        // Updating your data here...
    
        self.tableView.reloadData()
        self.refreshControl?.endRefreshing()
    }
    

UIRefresh Control은 각각에서 직접 지원됩니다.UICollectionView,UITableView ★★★★★★★★★★★★★★★★★」UIScrollView 필요) (iOS 10+ 필요)

각 뷰에는 refreshControl 인스턴스 속성이 있습니다.즉, 스크롤뷰에 서브뷰로 추가할 필요가 없어지기 때문에 다음 작업만 하면 됩니다.

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(doSomething), for: .valueChanged)
    
    // this is the replacement of implementing: "collectionView.addSubview(refreshControl)"
    collectionView.refreshControl = refreshControl
}

@objc func doSomething(refreshControl: UIRefreshControl) {
    print("Hello World!")
    
    // somewhere in your code you might need to call:
    refreshControl.endRefreshing()
}

개인적으로 서브뷰로 추가하는 것보다 스크롤뷰의 속성으로 취급하는 것이 더 자연스럽다고 생각합니다.특히 UIRefreshControl의 슈퍼뷰로서 적절한 뷰는 스크롤뷰뿐이기 때문에 UIRefreshControl을 사용하는 기능은 스크롤뷰로 작업할 때만 도움이 됩니다.그렇기 때문에 새로 고침 제어 뷰를 설정하기 위해서는 이 접근 방식이 더 명확해야 합니다.

아직 은 있습니다.addSubview: iOS 버전:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}

스위프트 4

var refreshControl: UIRefreshControl!

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    tableView.addSubview(refreshControl) 
}

@objc func refresh(_ sender: Any) {
    //  your code to reload tableView
}

또한 다음과 같은 기능을 통해 새로 고침을 중지할 수 있습니다.

refreshControl.endRefreshing()

스위프트 5

private var pullControl = UIRefreshControl()

pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        pullControl.addTarget(self, action: #selector(refreshListData(_:)), for: .valueChanged)
        if #available(iOS 10.0, *) {
            tableView.refreshControl = pullControl
        } else {
            tableView.addSubview(pullControl)
        }
// Actions
@objc private func refreshListData(_ sender: Any) {
        self.pullControl.endRefreshing() // You can stop after API Call
        // Call API
    }

Swift 사용

WebView를 갱신하려면 , 다음의 순서에 따릅니다.

이 코드를 사용해 보세요.

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

func addPullToRefreshToWebView(){
    var refreshController:UIRefreshControl = UIRefreshControl()

    refreshController.bounds = CGRectMake(0, 50, refreshController.bounds.size.width, refreshController.bounds.size.height) // Change position of refresh view
    refreshController.addTarget(self, action: Selector("refreshWebView:"), forControlEvents: UIControlEvents.ValueChanged)
    refreshController.attributedTitle = NSAttributedString(string: "Pull down to refresh...")
    YourWebView.scrollView.addSubview(refreshController)

}

func refreshWebView(refresh:UIRefreshControl){
    YourWebView.reload()
    refresh.endRefreshing()
}

Anhil의 대답이 나에게 많은 도움을 주었다.

다만, 한층 더 실험해 본 결과, 제시된 솔루션이 그다지 예쁘지 않은 UI의 결함을 일으키는 경우가 있는 것을 알 수 있었습니다.

대신, 이 접근방식을 택하는 것이 도움이 되었습니다*.

* 스위프트 2.1

//Create an instance of a UITableViewController. This will host your UITableView.
private let tableViewController = UITableViewController()

//Add tableViewController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableViewController)
self.tableViewController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableViewController.refreshControl = self.refreshControl

세부 사항

  • Xcode 버전 10.3 (10G8) Swift 5

특징들

  • 프로그래밍 방식으로 "Pull to Refresh"를 실행할 수 있는 기능
  • 다중 "풀 투 리프레시" 이벤트로부터 보호
  • 뷰 컨트롤러 전환 시 액티비티 인디케이터 애니메이션을 계속할 수 있는 기능(예: TabController의 경우)

솔루션

import UIKit

class RefreshControl: UIRefreshControl {

    private weak var actionTarget: AnyObject?
    private var actionSelector: Selector?
    override init() { super.init() }

    convenience init(actionTarget: AnyObject?, actionSelector: Selector) {
        self.init()
        self.actionTarget = actionTarget
        self.actionSelector = actionSelector
        addTarget()
    }

    private func addTarget() {
        guard let actionTarget = actionTarget, let actionSelector = actionSelector else { return }
        addTarget(actionTarget, action: actionSelector, for: .valueChanged)
    }

    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }

    func endRefreshing(deadline: DispatchTime? = nil) {
        guard let deadline = deadline else { endRefreshing(); return }
        DispatchQueue.global(qos: .default).asyncAfter(deadline: deadline) { [weak self] in
            DispatchQueue.main.async { self?.endRefreshing() }
        }
    }

    func refreshActivityIndicatorView() {
        guard let selector = actionSelector else { return }
        let _isRefreshing = isRefreshing
        removeTarget(actionTarget, action: selector, for: .valueChanged)
        endRefreshing()
        if _isRefreshing { beginRefreshing() }
        addTarget()
    }

    func generateRefreshEvent() {
        beginRefreshing()
        sendActions(for: .valueChanged)
    }
}

public extension UIScrollView {

    private var _refreshControl: RefreshControl? { return refreshControl as? RefreshControl }

    func addRefreshControll(actionTarget: AnyObject?, action: Selector, replaceIfExist: Bool = false) {
        if !replaceIfExist && refreshControl != nil { return }
        refreshControl = RefreshControl(actionTarget: actionTarget, actionSelector: action)
    }

    func scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: Bool = false) {
        _refreshControl?.refreshActivityIndicatorView()
        guard   let refreshControl = refreshControl,
                contentOffset.y != -refreshControl.frame.height else { return }
        setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: changeContentOffsetWithAnimation)
    }

    private var canStartRefreshing: Bool {
        guard let refreshControl = refreshControl, !refreshControl.isRefreshing else { return false }
        return true
    }

    func startRefreshing() {
        guard canStartRefreshing else { return }
        _refreshControl?.generateRefreshEvent()
    }

    func pullAndRefresh() {
        guard canStartRefreshing else { return }
        scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: true)
        _refreshControl?.generateRefreshEvent()
    }

    func endRefreshing(deadline: DispatchTime? = nil) { _refreshControl?.endRefreshing(deadline: deadline) }
}

사용.

// Add refresh control to UICollectionView / UITableView / UIScrollView
private func setupTableView() {
    let tableView = UITableView()
    // ...
    tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
}

@objc func refreshData(_ refreshControl: UIRefreshControl) {
    tableView?.endRefreshing(deadline: .now() + .seconds(3))
}

// Stop refreshing in UICollectionView / UITableView / UIScrollView
tableView.endRefreshing()

// Simulate pull to refresh in UICollectionView / UITableView / UIScrollView
tableView.pullAndRefresh()

풀샘플

여기에 솔루션 코드를 추가하는 것을 잊지 마십시오.

import UIKit

class ViewController: UIViewController {

    private weak var tableView: UITableView?

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

    private func setupTableView() {
        let tableView = UITableView()
        view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.dataSource = self
        tableView.delegate = self
        tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
        self.tableView = tableView
    }
}

extension ViewController {
    @objc func refreshData(_ refreshControl: UIRefreshControl) {
        print("refreshing")
        tableView?.endRefreshing(deadline: .now() + .seconds(3))
    }
}

extension ViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int { return 1 }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = "\(indexPath)"
        return cell
    }
}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.pullAndRefresh()
    }
}

「이러한 것은」입니다.refresh초기화되지 않았습니다. 해서 '하다'를 선택한 것에 해 주세요.refresh선택사항이 아닙니다.Swift에서는 콜을 하기 전에 을 지정해야 합니다.super.init(혹은 암묵적으로 불리고 있습니다만, 당신의 경우인 것 같습니다). 중 하나를 만듭니다.refresh옵션(원하는 것을 선택) 또는 어떤 방법으로든 초기화합니다.

Swift 소개 문서를 다시 읽어보실 것을 권장합니다.이 문서는 매우 상세하게 다루고 있습니다.

에는 @Anil이라고 하는 제어를 이 내장되어 .UIRefresControl조사해 볼 만한 가치가 있을지도 몰라요

저는 RSS 피드 앱을 만들었습니다.풀 투 리프레시 기능을 탑재하고 있습니다.이 기능에는, 상기의 몇개의 문제가 있었습니다.

다만, 유저에 대한 답변을 덧붙이자면, 사용 사례를 찾아 헤맸지만 찾을 수 없었습니다.웹(RSSFeed)에서 데이터를 다운로드하고 있었는데 테이블에서 새로고침할 스토리의 보기를 풀다운하려고 했습니다.

위에서 언급한 내용은 적절한 영역을 다루지만, 사람들이 겪고 있는 몇 가지 문제를 안고 있습니다.제가 한 일은 다음과 같습니다.그것은 큰 도움이 됩니다.

@Blankarsch의 어프로치를 취해 main.storyboard로 이동하여 리프레시를 사용할 테이블 뷰를 선택했지만 IBOutlet과 IBAction을 생성하여 리프레시를 효율적으로 사용하는 것은 언급하지 않았습니다.

//Created from main.storyboard cntrl+drag refresh from left scene to assistant editor
@IBOutlet weak var refreshButton: UIRefreshControl

override func viewDidLoad() {
  ...... 
  ......
  //Include your code
  ......
  ......
  //Is the function called below, make sure to put this in your viewDidLoad 
  //method or not data will be visible when running the app
  getFeedData()
}

//Function the gets my data/parse my data from the web (if you havnt already put this in a similar function)
//remembering it returns nothing, hence return type is "-> Void"
func getFeedData() -> Void{
  .....
  .....
}

//From main.storyboard cntrl+drag to assistant editor and this time create an action instead of outlet and 
//make sure arguments are set to none and note sender
@IBAction func refresh() {
  //getting our data by calling the function which gets our data/parse our data
  getFeedData()

  //note: refreshControl doesnt need to be declared it is already initailized. Got to love xcode
  refreshControl?.endRefreshing()
}

이게 나와 같은 상황에 있는 사람에게 도움이 되길 바란다.

func pullToRefresh(){

    let refresh = UIRefreshControl()
    refresh.addTarget(self, action: #selector(handleTopRefresh(_:)), for: .valueChanged )
    refresh.tintColor = UIColor.appBlack
    self.tblAddressBook.addSubview(refresh)

}
@objc func handleTopRefresh(_ sender:UIRefreshControl){
    self.callAddressBookListApi(isLoaderRequired: false)
    sender.endRefreshing()
}

모든 클래스에서 사용할 수 있도록 새로 고침을 위해 풀 확장 기능을 만들 것을 권장합니다.

1) 빈 swift file : File - New - File - Swift File로 만듭니다.

2) 다음 추가

    //  AppExtensions.swift

    import Foundation
    import UIKit    

    var tableRefreshControl:UIRefreshControl = UIRefreshControl()    

    //MARK:- VIEWCONTROLLER EXTENSION METHODS
    public extension UIViewController
    {
        func makePullToRefreshToTableView(tableName: UITableView,triggerToMethodName: String){

            tableRefreshControl.attributedTitle = NSAttributedString(string: "TEST: Pull to refresh")
            tableRefreshControl.backgroundColor = UIColor.whiteColor()
            tableRefreshControl.addTarget(self, action: Selector(triggerToMethodName), forControlEvents: UIControlEvents.ValueChanged)
            tableName.addSubview(tableRefreshControl)
        }
        func makePullToRefreshEndRefreshing (tableName: String)
        {
            tableRefreshControl.endRefreshing()
//additional codes

        }
    }    

3) View Controller에서 다음 메서드를 호출합니다.

  override func viewWillAppear(animated: Bool) {

self.makePullToRefreshToTableView(bidderListTable, triggerToMethodName: "pullToRefreshBidderTable")
}

4) 갱신을 종료하고 싶은 시점:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")

리프레쉬를 위해 사용하고 있는 풀

DGElasticPullToRefresh(DGElasticPullToRef

https://github.com/gontovnik/DGElasticPullToRefresh

인스톨

포드 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

그리고 이 함수를 당신의 빠른 파일에 넣고 당신의 function을 호출합니다.

func view를 덮어씁니다(_ 애니메이션:부울)

     func Refresher() {
      let loadingView = DGElasticPullToRefreshLoadingViewCircle()
      loadingView.tintColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
      self.table.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in

          //Completion block you can perfrom your code here.

           print("Stack Overflow")

           self?.table.dg_stopLoading()
           }, loadingView: loadingView)
      self.table.dg_setPullToRefreshFillColor(UIColor(red: 255.0/255.0, green: 57.0/255.0, blue: 66.0/255.0, alpha: 1))
      self.table.dg_setPullToRefreshBackgroundColor(self.table.backgroundColor!)
 }

뷰가 삭제되는 동안 참조를 삭제하는 것을 잊지 마십시오.

이 코드를 리프레시하기 위해 pull을 제거하다

func viewDiDisplayed(_ 애니메이션:부울)

override func viewDidDisappear(_ animated: Bool) {
      table.dg_removePullToRefresh()

 }

그리고 그것은 마치

여기에 이미지 설명 입력

해피 코딩 :)

코드 몇 줄을 사용하면 이 작업을 수행할 수 있습니다.서드파티 라이브러리 또는 UI를 사용하는 이유.iOS에는 풀 투 리프레쉬 기능이 내장되어 있습니다.이렇게 빨리 할 수 있어요.

여기에 이미지 설명 입력

var pullControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   pullControl.addTarget(self, action: #selector(pulledRefreshControl(_:)), for: UIControl.Event.valueChanged)
   tableView.addSubview(pullControl) // not required when using UITableViewController
}

@objc func pulledRefreshControl(sender:AnyObject) {
   // Code to refresh table view  
}

tableView의 다음 서브클래스를 사용할 수 있습니다.

import UIKit

protocol PullToRefreshTableViewDelegate : class {
    func tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
}

class PullToRefreshTableView: UITableView {

    @IBOutlet weak var pullToRefreshDelegate: AnyObject?
    private var refreshControl: UIRefreshControl!
    private var isFirstLoad = true

    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)

        if (isFirstLoad) {
            addRefreshControl()
            isFirstLoad = false
        }
    }

    private func addRefreshControl() {
        refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
        self.addSubview(refreshControl)
    }

    @objc private func refresh() {
       (pullToRefreshDelegate as? PullToRefreshTableViewDelegate)?.tableViewDidStartRefreshing(self)
    }

    func endRefreshing() {
        refreshControl.endRefreshing()
    }

}

builder에서 테이블 를 1로 보기PullToRefreshTableView '만들다'를 만들 수도 있습니다.PullToRefreshTableView

- 2 - - the를 합니다.PullToRefreshTableViewDelegate

3 -tableViewDidStartRefreshing(tableView: PullToRefreshTableView)되면 뷰 됩니다.

- 콜4 ★★yourTableView.endRefreshing()하게

저는 Xcode 7.2를 사용하여 이렇게 작업을 하게 되었는데, 이것이 큰 버그라고 생각합니다. my my my i ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」UITableViewController 안에viewWillAppear

refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged)
refreshControl!.beginRefreshing()

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

는 문자 '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다' configureMessage() 후 메서드UIRefreshControl그 후, 그 후의 갱신은 정상적으로 동작합니다.

2023년, 이 단순함은

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    your data source = latest ...
    table.reloadData()
    
    table.refreshControl = UIRefreshControl()
    table.refreshControl?.addTarget(self,
       action: #selector(pulldown), for: .valueChanged)
    table.refreshControl?.tintColor = .clear
}

@objc func pulldown() {
    your data source = latest ...
    table.reloadData()
    DispatchQueue.main.async { self.table.refreshControl?.endRefreshing() }
}

대부분의 경우, 당신은 "스피너"를 원하지 않습니다.스피너를 숨기는 가장 쉬운 방법은 다음과 같습니다.

    table.refreshControl?.tintColor = .clear

바로 그겁니다.


불명확한 으로 서브클래스를 하고 UIRefreshControl그 방법을 알 수 있는 훌륭한 최신 답변이 여기에 있습니다.

다른 답변은 정답입니다.자세한 내용은 이 투고를 체크하여 새로 고칩니다.

스토리보드에서 새로 고침 사용

UITableViewController를 사용하는 경우 솔루션은 매우 간단합니다.먼저 스토리보드에서 테이블 뷰 컨트롤러를 선택하고 속성 검사기를 열고 새로 고침을 활성화합니다.

UITableViewController는 개봉 후 UIRefreshControl에 대한 참조가 포함되어 있습니다.사용자가 다운되었을 때 리프레시를 시작하고 완료하려면 몇 가지 사항을 배선하기만 하면 됩니다.

viewDidLoad()를 덮어씁니다.

viewDidLoad()를 덮어쓸 때 다음과 같이 새로 고침을 처리할 대상을 추가합니다.

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
        
    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
}
  1. action 인수로 "handleRefresh:"(콜론에 주의)를 지정했으므로 이 UITableViewController 클래스에 같은 이름의 함수를 정의해야 합니다.또한 함수는 하나의 인수를 사용해야 합니다.
  2. Value Changed라는 UIControl Event에 대해 이 액션을 호출하고 싶습니다.
  3. 말고 꼭 해 주세요.refreshControl.endRefreshing()

상세한 것에 대하여는, 「링크」를 참조해 주세요.모든 크레딧은 그 투고에 귀속됩니다.

커스터마이즈성, 코드 복제 및 새로고침 제어에 따른 버그 때문에, 다음을 사용하는 라이브러리 PullToRefreshDSL을 만들었습니다.DSL와 같은 패턴SnapKit

// You only have to add the callback, rest is taken care of
tableView.ptr.headerCallback = { [weak self] in // weakify self to avoid strong reference
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) { // your network call
        self?.tableView.ptr.isLoadingHeader = false // setting false will hide the view
    }
}

magic 키워드만 추가하면 됩니다.ptrUIScrollView 서브클래스(예: UITableView/UICollectionView) 후

라이브러리를 다운로드할 필요는 없습니다.소스 코드를 탐색하고 수정할 수 있습니다. iOS용으로 새로 고침하기 위한 풀 구현이 가능한 경우입니다.

언급URL : https://stackoverflow.com/questions/24475792/how-to-use-pull-to-refresh-in-swift

반응형