स्विफ्ट में ताज़ा करने के लिए पुल का उपयोग कैसे करें?


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

मैं समझ रहा हूं :

संपत्ति 'self.refresh' सुपरइनिट कॉल पर आरंभिक नहीं है

कृपया मुझे पहचानने वालों के व्यवहार को समझने में मदद करें। एक कार्य नमूना कोड एक बड़ी मदद होगी।

धन्यवाद।



हां, मुझे केवल इस कार्यक्षमता की आवश्यकता है लेकिन मेरे पास ओबीजीसी का कोई सुराग नहीं है। स्विफ्ट में लागू करना चाहते हैं।
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
धन्यवाद! मैंने इसका इस्तेमाल किया। आलसी लोडिंग के लिए बस कुछ ट्विकिंग। मैं ऐसा करूंगा: "आलसी var ताज़ाकंट्रोल = UIRefreshControl ()" मुझे यह अच्छा अभ्यास लगता है कि हम चर की जबरन अलौकिकता से बचें, क्योंकि ऐसा लगता है कि यह भाषा सुरक्षा को हरा देता है।
nmdias

10
बस एक त्वरित ध्यान दें, आपको रिफ्रेशकंट्रोल को टेबलव्यू में जोड़ने की भी आवश्यकता नहीं है। यह निहित है।
केंड्रिक लेडेट

1
@KendrickLedet भले ही आप UITableViewController का उपयोग न करें?
वैन डू ट्रान

3
मैं इस समाधान का उपयोग तालिका के शीर्ष पर और तल पर कैसे कर पाऊंगा?
ऑस्टिन

3
स्विफ्ट 4 अपडेट: रिफ्रेशकंट्रोल.डेड टार्गेट (सेल्फ, एक्शन: "रिफ्रेश:", फॉर: .valueChanged)
अक्सेली

148

स्टोरीबोर्ड और स्विफ्ट के साथ एक समाधान ...

1.) अपनी .storyboard फ़ाइल खोलें, अपने स्टोरीबोर्ड में TableViewController का चयन करें और यूटिलिटीज में टेबल व्यू कंट्रोलर - रिफ्रेशिंग सुविधा को "सक्षम करें"।

यहां छवि विवरण दर्ज करें

2.) संबंधित UITableViewController- क्लास खोलें और 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.) नीचे दिए गए तरीके को देखने के लिए ऊपर जोड़ें विधि-विधि

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

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

7
इसके अलावा, आप स्टोरीबोर्ड में रिफ्रेश कंट्रोल से अपने ViewController के लिए नियंत्रण-ड्रैगिंग द्वारा स्टोरीबोर्ड के साथ ताज़ा कार्रवाई जोड़ सकते हैं
uiureo

यदि मेरा लोडिंग डेटा अतुल्यकालिक है, तो क्या मुझे put self.tableView.reloadData()और self.refreshControl?.endRefreshing()कॉलबैक में होना चाहिए ?
कियान चेन

बिल्कुल सही! और reloadData()अपने यूआई को तुरंत रिफ्रेश करने के लिए मुख्य कतार में डालें : dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
ब्लैंक

1
इस तरह से इस कारण के लिए स्वीकार किए गए उत्तर पर प्राथमिकता दी गई थी कि तब कोई लेआउट बग (कम से कम मेरे लिए स्विफ्ट 2+ का उपयोग करके)
रयान वाल्टन

1
इस उत्तर में सबसे अधिक वोट होना चाहिए और सही उत्तर होना चाहिए
क्रुमेंस

75

मैं एक PRETTY COOL फीचर का उल्लेख करना चाहूंगा जिसे iOS 10 के बाद से शामिल किया गया है, जो है:

अभी के लिए, UIRefreshControl प्रत्येक में सीधे समर्थित है UICollectionView, UITableViewऔर UIScrollView!

इनमें से हर एक दृश्य में रिफ्रेशकंट्रोल इंस्टैंस प्रॉपर्टी है, जिसका अर्थ है कि अब इसे आपके स्क्रॉल व्यू में सबव्यू के रूप में जोड़ने की आवश्यकता नहीं है , आपको बस इतना करना है:

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

अरे यार, मैं क्या करूँ? अगर मैं reload.Data कहते हैं, तो यह फिर से लोड नहीं करना चाहता!

@JavierV। doSomethingफ़ंक्शन में एक ब्रेकपॉइंट जोड़ें , अगर यह उपलब्ध है तो आपको अपना कोड चेक करना होगा।
अहमद एफ

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()अपने उदाहरण में उल्लेख करना न भूलें !
कॉन्स्टैंटिनोस नैटियोस

हाय मुझे लगता है कि जिस तरह से मेरी 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 }। फिर एंडफ्रेशिंग कॉल करें (), यह काम नहीं है (रिफ्रेशरोल अभी भी वहां दिखा), लेकिन अपने तरीके से पालन करें, यह काम किया, कृपया मुझे बताएं क्यों?
ली

@lee क्योंकि rfControl स्थानीय है और बाहर से कोई पहुँच नहीं है। VC के लिए एक वैश्विक चर के रूप में rfControl को इनिशियलाइज़ करने का प्रयास करें: var rfControl = UIRefreshControl (), और rfControl.endRefreshing () के साथ रूकें
गिल्ड ब्रूनफ़र

एक प्रश्न: जहां .valueChangedघटना शुरू हो रही है? मैं इस संबंध को नहीं समझता।
जूनियर जूनियर

जब UIRefreshControl को ट्रिगर किया जाता है, जैसा कि आप देखते हैं जब आप AddTarget: refreshControl.addTarget (self, action: #selector (self.refresh), के लिए:
UIContreshEvents.valueChanged

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

धन्यवाद महोदय! एक नॉब की समस्या का हल मैंने सीखने के दौरान किया है।
एड्रियन डेविड स्मिथ

5

अनिल के जवाब से मुझे बहुत मदद मिली।

हालाँकि, आगे प्रयोग करने के बाद मैंने देखा कि सुझाए गए समाधान कभी-कभी एक बहुत ही सुंदर यूआई गड़बड़ का कारण बनते हैं ।

इसके बजाय, इस दृष्टिकोण के लिए जा रहा है * मेरे लिए चाल चली ।

* स्विफ्ट 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वैकल्पिक करें (शायद आप क्या चाहते हैं) या इसे किसी तरह से इनिशियलाइज़ करें।

मैं स्विफ्ट परिचयात्मक प्रलेखन को फिर से पढ़ने का सुझाव दूंगा, जो इसे महान लंबाई में शामिल करता है।

एक आखिरी बात, जवाब का हिस्सा नहीं है, जैसा कि @Anil द्वारा बताया गया है, आईओएस नामक आईओएस में रिफ्रेश कंट्रोल के लिए एक पुल बनाया गया है UIRefresControl, जो देखने लायक कुछ हो सकता है।


2

मैंने एक RSS फीड ऐप बनाया है जिसमें मेरे पास एक पुल टू रिफ्रेश फीचर है जो मूल रूप से ऊपर सूचीबद्ध कुछ समस्याओं का था।

लेकिन ऊपर दिए गए उपयोगकर्ताओं के उत्तरों में जोड़ने के लिए, मैं अपने उपयोग के मामले में हर जगह देख रहा था और यह नहीं मिल रहा था। मैं वेब (RSSFeed) से डेटा डाउनलोड कर रहा था और मैं ताज़ा करने के लिए कहानियों के अपने tableView पर नीचे खींचना चाहता था।

ऊपर जो उल्लेख किया गया है वह सही क्षेत्रों को कवर करता है लेकिन लोगों को होने वाली कुछ समस्याओं के साथ, यहाँ मैंने जो किया है और यह एक इलाज का काम करता है:

मैंने @Bankarsch का दृष्टिकोण लिया और मेरे main.storyboard पर गया और रिफ्रेश का उपयोग करने के लिए टेबल व्यू का चयन किया, फिर जो उल्लेख नहीं किया गया था वह रिफ्रेश कुशलता से उपयोग करने के लिए IBOutlet और IBAation बना रहा है

//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

मेरा सुझाव है कि हर वर्ग में उपयोग के लिए पुल टू रिफ्रेश का विस्तार किया जाए।

1) एक खाली स्विफ्ट फ़ाइल बनाएं: फ़ाइल - नई - फ़ाइल - स्विफ्ट फ़ाइल।

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
आपका कोड प्रोजेक्ट नाम और कॉपीराइट नोटिस के साथ है, हो सकता है कि आपके लिए अच्छा न हो :)। जो भी कोड आपने यहां पोस्ट किया है, वह सभी के लिए मुफ्त होना चाहिए
अनिल वर्गीज

धन्यवाद अनिल! मैं उन्हें हटाना भूल गया।
एजी

1

ताज़ा करने के लिए खींच के लिए मैं का उपयोग कर रहा हूँ

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

स्थापना

पॉड 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

और इस फ़ंक्शन को अपनी स्विफ्ट फ़ाइल में डाल दें और इस funtion को अपने फोन से कॉल करें

ओवरराइड func viewWillAppear (_ एनिमेटेड: बूल)

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

और न ही संदर्भ को हटाने के लिए भूल जाते हैं जबकि दृश्य गायब हो जाएगा

इस कोड को ताज़ा करने के लिए पुल को हटाने के लिए अपने में डाल दें

ओवरराइड दुर्गंध देखेंडीडस्पायर (_ एनिमेटेड: बूल)

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

 }

और ऐसा लगेगा

यहां छवि विवरण दर्ज करें

मुबारक कोडिंग :)


1

आप कोड की कुछ पंक्तियों का उपयोग करके इसे प्राप्त कर सकते हैं। तो क्यों आप थर्ड पार्टी लाइब्रेरी या यूआई में फंसने जा रहे हैं। ताज़ा करने के लिए पुल 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

आप तालिका के इस उपवर्ग का उपयोग कर सकते हैं:

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 - इंटरफ़ेस बिल्डर में अपने टेबल व्यू की कक्षा को बदलें 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 () के अपने ओवरराइड में, निम्नानुसार रिफ्रेश को संभालने के लिए एक लक्ष्य जोड़ें:

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. चूँकि मैंने कार्रवाई हैंडल के रूप में निर्दिष्ट किया है: "(कोलन पर ध्यान दें!) एक्शन तर्क के रूप में, मुझे इसी नाम के साथ इस UITableViewController वर्ग में एक फ़ंक्शन को परिभाषित करने की आवश्यकता है। इसके अतिरिक्त, फ़ंक्शन को एक तर्क लेना चाहिए
  2. हम इस कार्रवाई को वैल्यूचेंज्ड नामक UIControlEvent के लिए बुलाया जाना चाहेंगे
  3. कॉल करने के लिए मत भूलना refreshControl.endRefreshing()

अधिक जानकारी के लिए कृपया लिंक का उल्लेख करें और सारा क्रेडिट उस पोस्ट पर चला जाए


जब तक यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
तुनकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.