objective c - UITefreshControl UITableViewController के बिना




objective-c ios (8)

बस जिज्ञासा है, क्योंकि यह तुरंत संभव नहीं लगता है, लेकिन क्या UITableViewController subclass का उपयोग किये बिना नए आईओएस 6 UIRefreshControl क्लास का लाभ उठाने का कोई UIRefreshControl तरीका है?

मैं अक्सर UIViewController उपयोग UITableView UIViewController साथ करता हूं और UITableViewDataSource और UITableViewDelegate अनुरूप एक UITableViewController का उपयोग करने के बजाय।


आईओएस 10 स्विफ्ट 3.0

यह आसान है

import UIKit

class ViewControllerA: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var myTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        myTableView.delegate = self
        myTableView.dataSource = self

        if #available(iOS 10.0, *) {
            let refreshControl = UIRefreshControl()
            let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh")
            refreshControl.attributedTitle = NSAttributedString(string: title)
            refreshControl.addTarget(self,
                                     action: #selector(refreshOptions(sender:)),
                                     for: .valueChanged)
            myTableView.refreshControl = refreshControl
        }
    }

    @objc private func refreshOptions(sender: UIRefreshControl) {
        // Perform actions to refresh the content
        // ...
        // and then dismiss the control
        sender.endRefreshing()
    }

    // MARK: - Table view data source

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 12
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        cell.textLabel?.text = "Cell \(String(indexPath.row))"
        return cell
    }

}

यदि आप आईओएस 10 यूआईआरफ्रेश कंट्रोल के बारे में जानना चाहते हैं तो here पढ़ें।


आप जो प्रयास करेंगे, वह आपके द्वारा उपयोग किए जा रहे व्यू कंट्रोलर के अंदर कंटेनर व्यू का उपयोग करना है। आप समर्पित टेबलव्यू के साथ स्वच्छ UITableViewController उपclass को परिभाषित कर सकते हैं और उस स्थान को ViewController में रख सकते हैं।


एक झुकाव पर, और ड्रमरबी की प्रेरणा के आधार पर, मैंने अपने UITableView UIRefreshControl रूप में बस एक UIRefreshControl इंस्टेंस जोड़ने की कोशिश की। और यह जादूगर बस काम करता है!

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView addSubview:refreshControl];

यह आपके टेबल व्यू के ऊपर एक UIRefreshControl जोड़ता है और UITableViewController का उपयोग किये बिना अपेक्षित काम करता है :)

संपादित करें: यह उपर्युक्त काम करता है लेकिन कुछ लोगों ने बताया है कि इस तरह से यूआईआरआईफ्रेश कंट्रोल जोड़ते समय थोड़ा सा "स्टटर" होता है। इसका समाधान एक UITableViewController को चालू करना है, और फिर उस पर अपना यूआईआरफ़्रेश कंट्रोल और UITableView सेट करना है, यानी:

UITableViewController *tableViewController = [[UITableViewController alloc] init];
tableViewController.tableView = self.myTableView;

self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;

एक सबव्यू के रूप में ताज़ा नियंत्रण जोड़ना सेक्शन हेडर के ऊपर खाली स्थान बनाता है।

इसके बजाय, मैंने अपने UIViewController में एक UITableViewController को एम्बेड किया, फिर मेरी tableView बदल दी गई संपत्ति को एम्बेडेड की ओर इंगित करने के लिए देखें, और व्हायोला! न्यूनतम कोड परिवर्तन। :-)

कदम:

  1. स्टोरीबोर्ड में एक नया UITableViewController बनाएं और इसे अपने मूल UIViewController में एम्बेड करें
  2. @IBOutlet weak var tableView: UITableView! बदलें @IBOutlet weak var tableView: UITableView! जैसा कि नीचे दिखाया गया है, नए एम्बेडेड UITableViewController से एक के साथ
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tableViewController = self.childViewControllers.first as! UITableViewController
        tableView = tableViewController.tableView
        tableView.dataSource = self
        tableView.delegate = self

        // Now we can (properly) add the refresh control
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: .ValueChanged)
        tableViewController.refreshControl = refreshControl
    }

    ...
}

खैर UIRefreshControl एक UIView सबक्लास है, इसलिए आप इसे अपने आप उपयोग कर सकते हैं। मुझे यकीन नहीं है कि यह कैसे खुद को प्रस्तुत करता है। प्रतिपादन बस फ्रेम पर निर्भर हो सकता है, लेकिन यह UIScrollView या UITableViewController पर भी भरोसा कर सकता है।

किसी भी तरह से, यह एक सुरुचिपूर्ण समाधान की तुलना में एक हैक के अधिक होने जा रहा है। मैं अनुशंसा करता हूं कि आप उपलब्ध तृतीय पक्ष क्लोन में से किसी एक को देखें या अपना खुद का लिखें।

ODRefreshControl

SlimeRefresh


यह पता चला है कि आप UIViewCiewroller का उपयोग UITableView सबव्यू के साथ करते हैं और UITableViewDataSource और UITableViewDelegate के अनुरूप करते हैं, तो आप निम्न का उपयोग कर सकते हैं:

self.refreshControl = [[UIRefreshControl alloc]init];
[self.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

स्वीकृत उत्तर के कारण होने वाले स्टटर को खत्म करने के लिए, आप अपने UITableView को UITableView पर असाइन कर सकते हैं।

_tableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
[self addChildViewController:_tableViewController];

_tableViewController.refreshControl = [UIRefreshControl new];
[_tableViewController.refreshControl addTarget:self action:@selector(loadStream) forControlEvents:UIControlEventValueChanged];

_theTableView = _tableViewController.tableView;

संपादित करें:

बिना UIRefreshControl के बिना UIRefreshControl जोड़ने का कोई तरीका नहीं है और UIRefreshControl पर डेटा को ताज़ा करने के बाद अच्छी एनीमेशन बनाए रखें।

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.theTableView addSubview:refreshControl];
[self.theTableView sendSubviewToBack:refreshControl];

बाद में ताज़ा डेटा को संभालने पर ...

- (void)handleRefresh:(UIRefreshControl *)refreshControl {
    [self.theTableView reloadData];
    [self.theTableView layoutIfNeeded];
    [refreshControl endRefreshing];
}

-endRefresh बाद एक सेकंड के अंश द्वारा रीफ्रेश -endRefresh -ेंड -endRefresh विधि को कॉल में देरी करने का प्रयास करें, एनएसओब्जेक्ट्स -परफॉर्म -endRefresh का उपयोग करके, या तो इसके सामग्री को फिर से लोड करता है -performSelector:withObject:afterDelay: या जीसीडी का dispatch_after

मैंने इसके लिए UIRefreshControl पर एक श्रेणी बनाई:

@implementation UIRefreshControl (Delay)

- (void)endRefreshingAfterDelay:(NSTimeInterval)delay {
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self endRefreshing];
    });
}

@end

मैंने इसका परीक्षण किया और यह संग्रह दृश्यों पर भी काम करता है। मैंने देखा है कि 0.01 सेकेंड जितना छोटा विलंब पर्याप्त है:

// My data refresh process here while the refresh control 'isRefreshing'
[self.tableView reloadData];
[self.refreshControl endRefreshingAfterDelay:.01];