Swift에서 pull을 사용하여 새로 고치는 방법은 무엇입니까?


248

스위프트를 사용하여 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'속성이 초기화되지 않았습니다.

제스처 인식기의 동작을 이해하도록 도와주세요. 작동하는 샘플 코드는 큰 도움이 될 것입니다.

감사.


당신은 끌어 오기가있는 tableview에서 같은 어떤 것을 새로 고칠 techrepublic.com/blog/software-engineer/...
아닐 Varghese

예,이 기능 만 필요하지만 ObjC에 대한 실마리는 없습니다. 신속하게 구현하고 싶습니다.
xrage

답변:


591

iOS에 내장 된 새로 고침 기능 이 내장되어 있습니다. 당신은 신속하게 이렇게 할 수 있습니다

var 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()

15
감사! 나는 이것을 사용했다. 게으른 로딩을 위해 약간의 조정. "lazy var refreshControl = UIRefreshControl ()"언어 안전을 무너 뜨리는 것처럼 느끼기 때문에 변수를 강제로 언 래핑하지 않는 것이 좋습니다.
nmdias 2016

10
간단히 말해 테이블 ​​뷰에 refreshControl을 추가 할 필요도 없습니다. 암시 적으로 처리됩니다.
Kendrick Ledet 5

1
UITableViewController를 사용하지 않더라도 @KendrickLedet?
Van Du Tran

3
이 솔루션을 테이블 뷰의 상단과 하단에 어떻게 사용할 수 있습니까?
AustinT

3
스위프트 4 업데이트 : refreshControl.addTarget (self, action : "refresh :", for : .valueChanged)
akseli

148

스토리 보드와 신속한 솔루션 ...

1.) .storyboard 파일을 열고 스토리 보드에서 TableViewController를 선택한 다음 유틸리티에서 Table View Controller-Refreshing 기능을 "활성화"하십시오.

여기에 이미지 설명을 입력하십시오

2.) 관련 UITableViewController-Class를 열고 viewDidLoad-Method에 다음 줄을 추가하십시오.

self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)

스위프트 5.0 편집 :

self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)

스위프트 2.2 또는

self.refreshControl?.addTarget(self, action: #selector(TestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)

3.) viewDidLoad-Method 위에 다음 메소드를 추가하십시오.

func refresh(sender:AnyObject)
{
    // Updating your data here...

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}

7
또한 스토리 보드의 Refresh Control에서 ViewController로 제어-드래그를하여 스토리 보드로 새로 고침 작업을 추가 할 수 있습니다
uiureo

내 데이터로드가 비동기, 내가해야 put self.tableView.reloadData()하고 self.refreshControl?.endRefreshing()콜백에서와?
Qian Chen

바로 그거죠! 그리고을 넣어 reloadData()즉시 UI를 새로 메인 큐에 : dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });

1
이 방법은 (2 + 적어도 나에게 빠른 사용을위한)를 더 레이아웃 버그가 없다는 이유로 허용 대답 선호 한
라이언 월튼

1
이 답변은 가장 많은 표를 가져야하고 정답이어야합니다.
krummens

75

iOS 10부터 포함 된 PRETTY COOL 기능 에 대해 언급하고 싶습니다 .

지금은 UIRefreshControl는 직접 각 지원됩니다 UICollectionView, UITableViewUIScrollView!

이러한 각 뷰에는 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
}

func doSomething(refreshControl: UIRefreshControl) {
    print("Hello World!")

    // somewhere in your code you might need to call:
    refreshControl.endRefreshing()
}

개인적으로, 하위 뷰로 추가하는 것보다 스크롤 뷰의 속성으로 처리하는 것이 더 자연 스럽습니다. 특히 UIRefreshControl의 슈퍼 뷰로 적합한 뷰는 스크롤 뷰뿐입니다. 즉 UIRefreshControl을 사용하는 기능은 스크롤보기로 작업 할 때 유용합니다. 이것이 바로이 접근 방식이 새로 고침 제어보기를 설정하는 것이 더 분명한 이유입니다.

그러나 여전히 addSubviewiOS 버전 기반 의 옵션을 사용할 수 있습니다 .

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

안녕하세요, doSomething 기능에서 무엇을 부르나요? reload.Data를 호출하면 다시로드하고 싶지 않습니다!

@JavierV. 기능에 중단 점을 추가하십시오. doSomething도달 가능한 경우 코드를 확인해야합니다.
Ahmad F

50

스위프트 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()

tableView.reloadData()당신의 예에서 언급하는 것을 잊지 마십시오 !
Konstantinos Natsios

안녕하세요, 그런 식으로 refreshcontrol을 만듭니다 var refControl: UIRefreshControl{ let rfControl = UIRefreshControl() rfControl.attributedTitle = NSAttributedString(string: "") rfControl.tintColor = UIColor(red:0.16, green:0.68, blue:0.9, alpha:1) rfControl.addTarget(self, action: #selector(getNewMessageList), for: .valueChanged) return rfControl }. 그런 다음 endRefreshing ()을 호출하면 작동하지 않지만 (refreshcontrol이 여전히 표시되어 있음) 길을 따라 작동하면 이유를 알려주십시오.
lee

@lee rfControl은 로컬이므로 액세스 권한이 없기 때문입니다. rfControl을 VC에 대한 전역 변수로 초기화하십시오. var rfControl = UIRefreshControl (), rfControl.endRefreshing ()으로 중지
Gilad Brunfman

질문 : .valueChanged이벤트가 어디서 트리거됩니까? 이 연결을 이해하지 못합니다.
juniorgarcia

UIRefreshControl이 트리거 될 때 addTarget : refreshControl.addTarget (self, action : #selector (self.refresh), for : UIControlEvents.valueChanged)를 볼 때 알 수 있듯이
Gilad Brunfman

9

에서 스위프트 이것을 사용,

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()
}

감사합니다! 내가 배우는 동안 겪은 멍청한 문제를 해결했습니다.
Adrian David Smith

5

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

2

오류가 알려주 refresh는 것은 초기화되지 않았다는 것입니다. 당신이 만드는 것을 선택하는 것이 주 refresh는 것을 스위프트 수단에있는 선택하지 문의하기 전에 값을 가지고 super.init(또는 암시 적 사건으로 보인다,라고). 어느 만드는 refresh옵션 (당신이 원하는 아마 무엇을) 또는 그것을 어떤 방법으로 초기화합니다.

Swift 소개 문서를 다시 읽으십시오.

@Anil이 지적한 것처럼 대답의 일부가 아닌 마지막 한 가지는 iOS라는 컨트롤을 새로 고침하여 UIRefresControl볼만한 가치가있을 수 있습니다.


2

원래 위에 나열된 몇 가지 문제 가있는 Pull To Refresh 기능이 있는 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()
}

희망이 나와 같은 상황에있는 사람에게 도움이되기를 바랍니다.


2
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()
}

2

세부

  • Xcode 버전 10.3 (10G8), 스위프트 5

풍모

  • 프로그래밍 방식으로 "새로 고침"을 수행하는 기능
  • 다중 "풀에서 리프레시"이벤트로부터 보호
  • 뷰 컨트롤러가 전환 될 때 (예 : 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()
    }
}

2

스위프트 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
    }

1

모든 클래스에서 사용하기 위해 Pull To Refresh 확장을 만드는 것이 좋습니다.

1) 빈 빠른 파일을 만듭니다 : 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")

1
귀하의 코드는 프로젝트 이름과 저작권 고지가 있으며 귀하에게 적합하지 않을 수 있습니다 :). 여기에 게시 한 코드는 모두 무료로 사용할 수 있어야합니다
Anil Varghese

감사합니다 Anil! 나는 그것들을 제거하는 것을 잊었다.
AG

1

풀을 새로 고치려면 사용하고 있습니다.

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

설치

포드 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

이 기능을 빠른 파일에 넣고이 기능을

func view 재정의 (WillAppear (_ animated : Bool)

     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!)
 }

뷰가 사라지는 동안 참조를 제거하는 것을 잊지 마십시오.

풀을 제거하려면이 코드를

func view 재정의 (DidDisappear (_ animated : Bool)

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

 }

그리고 그것은 보일 것입니다

여기에 이미지 설명을 입력하십시오

행복한 코딩 :)


1

몇 줄의 코드를 사용하여이를 달성 할 수 있습니다. 왜 타사 라이브러리 또는 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  
}

0

이 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()
    }

}

1-인터페이스 빌더에서 tableView 클래스를 프로그래밍 방식으로 변경 PullToRefreshTableView하거나 PullToRefreshTableView프로그래밍 방식으로 작성하십시오.

2- PullToRefreshTableViewDelegate뷰 컨트롤러에서 구현

3- tableViewDidStartRefreshing(tableView: PullToRefreshTableView)테이블 뷰 새로 고침이 시작되면 뷰 컨트롤러에서 호출됩니다.

4- yourTableView.endRefreshing()상쾌하게하기 위해 전화


0

이것이 내가 Xcode 7.2를 사용하여 작동하게 만드는 방법이며 주요 버그라고 생각합니다. 내 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한 후 메소드 를 호출 해야하며 후속 새로 고침이 정상적으로 작동합니다.


-1

다른 답변은 정확하지만 자세한 내용은이 게시물을 확인 하여 새로 고침

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

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. 액션 인수로“handleRefresh :”(콜론 참고)을 지정 했으므로이 UITableViewController 클래스에서 같은 이름으로 함수를 정의해야합니다. 또한 함수는 하나의 인수를 가져야합니다.
  2. ValueChanged라는 UIControlEvent에 대해이 조치를 호출하려고합니다.
  3. 전화하는 것을 잊지 마세요 refreshControl.endRefreshing()

자세한 내용은 링크를 참조하십시오 모든 링크는 해당 게시물로 이동


이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
Tunaki
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.