วิธีใช้ pull เพื่อรีเฟรชใน Swift?


248

ฉันกำลังสร้างโปรแกรมอ่าน RSS โดยใช้ swift และจำเป็นต้องใช้ pull เพื่อโหลดการทำงานใหม่

นี่คือวิธีที่ฉันพยายามทำ

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

ฉันได้รับ :

ไม่ได้เริ่มต้นคุณสมบัติ 'self.refresh' ที่การเรียก super.init

โปรดช่วยฉันในการทำความเข้าใจพฤติกรรมของผู้จดจำท่าทาง รหัสตัวอย่างที่ใช้งานได้จะช่วยได้มาก

ขอบคุณ


คุณต้องการดึงเพื่อรีเฟรชใน tableview บางสิ่งเช่นtechrepublic.com/blog/software-engineer/ …
Anil 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

10
เพียงแค่บันทึกย่อคุณไม่จำเป็นต้องเพิ่ม refreshControl ลงในตาราง นั่นคือการจัดการโดยปริยาย
Kendrick Ledet

1
@KendrickLedet แม้ว่าคุณจะไม่ได้ใช้ UITableViewController
Van Du Tran

3
ฉันจะใช้โซลูชันนี้สำหรับมุมมองด้านบนของตารางและด้านล่างได้อย่างไร
AustinT

3
Swift 4 update: refreshControl.addTarget (self, action: "refresh:", สำหรับ: .valueChanged)
akseli

148

วิธีแก้ปัญหาด้วยสตอรีบอร์ดและรวดเร็ว ...

1. ) เปิดไฟล์. storyboard ของคุณเลือก TableViewController ในสตอรี่บอร์ดของคุณและ "Enable" the Table View Controller - คุณสมบัติรีเฟรชในยูทิลิตี้

ป้อนคำอธิบายรูปภาพที่นี่

2. ) เปิด UITableViewController-Class ที่เกี่ยวข้องและเพิ่มบรรทัดต่อไปนี้ลงใน viewDidLoad-Method

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

แก้ไขสำหรับ Swift 5.0:

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

หรือใน Swift 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
นอกจากนี้คุณยังสามารถเพิ่มการดำเนินการรีเฟรชด้วยสตอรี่บอร์ดโดยการควบคุมการลากจากรีเฟรชคอนโทรลในสตอรี่บอร์ดไปยัง 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 ซึ่งเป็น:

สำหรับตอนนี้UIRefreshControlได้รับการสนับสนุนโดยตรงในแต่ละUICollectionView,UITableViewและUIScrollView!

แต่ละมุมมองเหล่านี้มีคุณสมบัติอินสแตนซ์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()
}

โดยส่วนตัวแล้วฉันคิดว่ามันเป็นธรรมชาติมากกว่าที่จะถือว่าเป็นคุณสมบัติสำหรับการเลื่อนดูมากกว่าการเพิ่มเป็นมุมมองย่อยโดยเฉพาะอย่างยิ่งเนื่องจากมุมมองที่เหมาะสมเท่านั้นที่จะเป็น superview สำหรับ UIRefreshControl เป็น scrollview เช่นการทำงานของการใช้ UIRefreshControl เท่านั้น มีประโยชน์เมื่อทำงานกับมุมมองเลื่อน นั่นเป็นสาเหตุที่วิธีการนี้ควรชัดเจนกว่าการตั้งค่ามุมมองรีเฟรชควบคุม

อย่างไรก็ตามคุณยังคงมีตัวเลือกในการใช้งานaddSubviewตามเวอร์ชัน iOS:

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

เฮ้ชายฉันจะเรียกอะไรใน doSomething func? ถ้าฉันเรียก 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

สวัสดีฉันสร้างการรีเฟรชควบคุมด้วยวิธีนี้: 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 () มันใช้งานไม่ได้ (การรีเฟรชควบคุมยังคงแสดงอยู่ที่นั่น) แต่ทำตามวิธีของคุณใช้งานได้โปรดแจ้งให้เราทราบว่าทำไม
lee

@lee เพราะ rfControl เป็นคนในพื้นที่และไม่สามารถเข้าถึงได้ ลองเริ่มต้น rfControl เป็นตัวแปรส่วนกลางสำหรับ VC: var rfControl = UIRefreshControl () และหยุดด้วย rfControl.endRefreshing ()
Gilad Brunfman

คำถาม: .valueChangedเหตุการณ์ที่ถูกเรียก? ฉันไม่เข้าใจการเชื่อมต่อนี้
juniorgarcia

เมื่อ UIRefreshControl ถูกทริกเกอร์ตามที่คุณเห็นเมื่อคุณ addTarget: refreshControl.addTarget (self, action: #selector (self.refresh) สำหรับ: 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()
}

ขอบคุณมาก! แก้ไขปัญหาของ noob ที่ฉันมีในขณะที่เรียนรู้
เอเดรียเดวิดสมิ ธ

5

คำตอบของ Anhil ช่วยฉันได้มาก

อย่างไรก็ตามหลังจากการทดลองเพิ่มเติมฉันสังเกตเห็นว่าวิธีแก้ปัญหาที่แนะนำบางครั้งทำให้เกิดความผิดพลาดของ UI ที่ไม่สวยผิดพลาด

แทนที่จะไปหาแนวทางนี้ * ทำเพื่อฉันแทน

* Swift 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

ฉันสร้างแอป 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), Swift 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

ฉันแนะนำให้ทำการต่อเติมเพื่อดึงเพื่อรีเฟรชเพื่อใช้ในทุกชั้นเรียน

1) สร้างไฟล์ swift ที่ว่างเปล่า: ไฟล์ - ใหม่ - ไฟล์ - ไฟล์ Swift

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) ในมุมมองควบคุมของคุณเรียกวิธีการเหล่านี้เป็น:

  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

และนำฟังก์ชั่นนี้ไปไว้ในไฟล์ที่รวดเร็วของคุณแล้วเรียก funtion นี้จากคุณ

แทนที่ func viewWillAppear (_ 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!)
 }

และอย่าลืมลบการอ้างอิงขณะที่มุมมองจะหายไป

เพื่อลบ pull เพื่อรีเฟรชใส่รหัสนี้ในของคุณ

แทนที่ func viewDidDisappear (_ animated: Bool)

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

 }

และมันจะดูเหมือน

ป้อนคำอธิบายรูปภาพที่นี่

Happy coding :)


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. เราต้องการให้มีการเรียกการกระทำนี้สำหรับ UIControlEvent ที่เรียกว่า ValueChanged
  3. อย่าลืมโทร refreshControl.endRefreshing()

สำหรับข้อมูลเพิ่มเติมกรุณาไปที่ลิงค์และเครดิตทั้งหมดไปที่โพสต์นั้น


ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Tunaki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.