दिलचस्प पोस्ट
कैसे objc_exception_throw को ब्रेकपॉइंट जोड़ने के लिए? कोण-मार्ग और कोणीय-यू-राउटर के बीच अंतर क्या है? यूट्यूब वीडियो WebView में नहीं खेल रहा है – एंड्रॉइड स्थानीय स्टोरेज में मैं एक सरणी कैसे संग्रहीत करूं? <Ui: repeat> के भीतर तत्व की सशर्त रेंडरिंग निर्दिष्ट करें? <C: if> काम करने के लिए प्रतीत नहीं होता है Google ReCAPTCHA कैसे आवश्यक हो? कैसे सी # में बहुआयामी (2 डी) सरणी का आकार बदलना है? क्रिया बार आकार कैसे बदलूए क्या डिबग के दौरान कचरा संग्रह चलता है? विशिष्ट URL में डेटा को कैसे सी # में WebClient का उपयोग करें HttpUrlConnection के शीर्षलेख को कैसे संशोधित करें चहचहाना बूटस्ट्रैप हिंडोला प्लगइन स्लाइड संक्रमण पर और बाहर फीका कर सकते हैं रीडटाइम में उपप्रोसेस से स्टडआउट को पकड़ना लिंक किए गए सर्वर MySQL कैसे बनाएँ एक आर फ़ंक्शन के भीतर से कई ग्राफिक्स जेनरेट करें

UITableViewController बिना UIRefreshControl

बस उत्सुक है, क्योंकि यह संभवतः संभव नहीं लगता है, लेकिन क्या नए IOS 6 UIRefreshControl वर्ग को UIRefreshControl क्लास का इस्तेमाल किए बिना फायदा उठाने का एक UIRefreshControl रास्ता है?

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

वेब के समाधान से एकत्रित समाधान "UITableViewController बिना UIRefreshControl"

एक कूल्हे पर, और ड्रमर्सबी के प्रेरणा के आधार पर, मैंने अपने UITableView एक UIRefreshControl रूप में एक UIRefreshControl उदाहरण को जोड़ने की कोशिश की और यह जादुई ही काम करता है!

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

यह आपकी तालिका दृश्य के ऊपर एक UIRefreshControl जोड़ता है और एक UITableViewController का उपयोग किए बिना अपेक्षित काम करता है 🙂


संपादित करें: यह ऊपर अभी भी काम करता है, लेकिन जैसा कि कुछ ने बताया है, इस तरीके से यूआईआरफेस कंट्रोल को जोड़ते समय थोड़े "हकलाना" होता है इसका एक समाधान UITableViewController को इन्स्तांत करना है, और उसके बाद अपने UIRefreshControl और 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; 

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

 _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 साथ कोई UITableViewController साथ एक UIRefreshControl जोड़ने का एक तरीका और tableview पर ताज़ा डेटा के बाद अच्छा एनीमेशन बनाए रखने के लिए।

 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]; } 

आप जो प्रयोग कर रहे हैं वह व्यू नियंत्रक के अंदर कंटेनर व्यू का उपयोग करने का प्रयास करेंगे। आप स्पष्ट यूटिव्यूव्यूकंट्रोलर उपवर्गा को समर्पित तालिकाव्यूव के साथ परिभाषित कर सकते हैं और दृश्यकंट्रोलर में जगह ले सकते हैं।

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

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

ODRefreshControl

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

SlimeRefresh

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

ताज़ा करने के लिए कॉल में देरी करने की कोशिश करेंटैब पर -endRefresh करें, तालिका के बाद एक अंश के एक अंश से नियंत्रण- -endRefresh विधि, या तो -performSelector:withObject:afterDelay: का उपयोग करके -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]; 

आईओएस 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 } } 

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

यदि आप iOS 10 UIRefreshControl के बारे में सीखना चाहते हैं तो यहां पढ़ें।

रिफ्रेश नियंत्रण को एक उपव्यू के रूप में जोड़ना, अनुभाग शीर्षकों के ऊपर एक रिक्त स्थान बनाता है।

इसके बजाय, मैंने अपने 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 } ... } 

स्विफ्ट 2.2 के लिए

पहले UIRefreshControl () करें

 var refreshControl : UIRefreshControl! 

आपके दृश्य में डीडलोड () विधि जोड़ें:

 refreshControl = UIRefreshControl() refreshControl.attributedTitle = NSAttributedString(string: "Refreshing..") refreshControl.addTarget(self, action: #selector(YourUIViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged) self.tableView.addSubview(refreshControl) 

और रीफ्रेश फंक्शन बनाएं

 func refresh(refreshControl: UIRefreshControl) { // do something ... // reload tableView self.tableView.reloadData() // End refreshing refreshControl.endRefreshing() } 

यहाँ एक और समाधान है जो थोड़ा अलग है।

मुझे कुछ दृश्य पदानुक्रम मुद्दों के कारण इसका उपयोग करना पड़ता था: मैं कुछ कार्यशीलता बना रहा था, जो दृश्य पदानुक्रम में विभिन्न स्थानों के आस-पास के दृश्यों की आवश्यकता होती है, जो कि यूआईटीबल वीआईयूआईटी-नियंत्रक की तालिकादृश्य का प्रयोग करते समय टूटी हुई होती है तालिका दृश्य यूआईटीबल वीआईयूआईसी नियंत्रक का मूल दृश्य है self.view) और सिर्फ एक नियमित रूप से देखने के लिए, यह असंगत नियंत्रक / दृश्य पदानुक्रम बनाया और दुर्घटना का कारण बना।

असल में अपने खुद के उप-वर्ग को यूआईटीबल वीआईयूआई नियंत्रक बनायें और भार दृश्य को एक अलग दृश्य के लिए self.view सौंपने के लिए ओवरराइड करें, और एक अलग तालिकादृश्य वापस करने के लिए तालिका दृश्य गुण को ओवरराइड करें।

उदाहरण के लिए:

 @interface MyTableVC : UITableViewController @end @interface MyTableVC () @property (nonatomic, strong) UITableView *separateTableView; @end @implementation MyTableVC - (void)loadView { self.view = [[UIView alloc] initWithFrame:CGRectZero]; } - (UITableView *)tableView { return self.separateTableView; } - (void)setTableView:(UITableView *)tableView { self.separateTableView = tableView; } @end 

जब केलर के समाधान के साथ मिलाया जाता है तो यह इस अर्थ में अधिक मजबूत होगा कि तालिकादृश्य अब एक नियमित रूप से देखने के लिए है, वीसी के मूल दृश्य नहीं है, और दृश्य पदानुक्रम बदलने के विरुद्ध अधिक मजबूत है। इसे इस तरीके से प्रयोग करने का उदाहरण:

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

इसके लिए एक और संभव उपयोग है:

इस तरह से subclassing से self.view से self.tableView को अलग करती है, अब यह संभव है कि यह UITableViewController को एक नियमित नियंत्रक के रूप में उपयोग करें, और self subviews के अन्य तरीकों को UITableView में subviews जोड़ने की विषमताओं के बिना जोड़ दें, इसलिए एक नियंत्रकों को UITableViewController बच्चों के बजाय सीधे UITableViewController के एक उप-वर्ग देखें।

कुछ चीज़ों को देखने के लिए:

चूंकि हम सुपर कॉल किए बिना टेबलदृश्य संपत्ति को ओवरराइड कर रहे हैं, इसलिए वहां कुछ चीजें देखने के लिए और जहां आवश्यक हो वहां उसे संभालना चाहिए। उदाहरण के लिए, मेरे उपरोक्त उदाहरण में तालिका दृश्य सेट करना तालिका दृश्य को self.view में नहीं जोड़ देगा और फ्रेम को सेट न करें जिसे आप करना चाहते हैं साथ ही, इस कार्यान्वयन में कोई डिफ़ॉल्ट तालिका नहीं है जिसे आप को दिया गया है जब क्लास तत्काल होता है, जो कुछ भी आप जोड़ना चाहते हैं। मैं इसे यहाँ शामिल नहीं करता क्योंकि यह मामला है, और यह समाधान वास्तव में केलर के समाधान के साथ अच्छी तरह से फिट बैठता है।

इसे इस्तेमाल करे,

उपरोक्त समाधान ठीक हैं, लेकिन तालिका दृश्य। रीफ़्रेश नियंत्रक केवल आईआईएस 9.x तक, यूआईटीबल वीआईयूआई नियंत्रक के लिए उपलब्ध है और आईआईएस 10.x से यूआईटीबल वीउ में आता है।

स्विफ्ट 3 में लिखा –

 let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: #selector(FeedViewController.loadNewData), for: UIControlEvents.valueChanged) // Fix for the RefreshControl Not appearing in background tableView?.addSubview(refreshControl) tableView.sendSubview(toBack: refreshControl) 

केलर का पहला सुझाव आईओएस 7 में एक अजीब बग का कारण बनता है जहां दृश्य नियंत्रक को फिर से दिखने के बाद टेबल के इंसेट बढ़ जाता है यूसीटेबल नियंत्रक का उपयोग करते हुए दूसरे उत्तर में बदलते हुए, मेरे लिए निश्चित चीजें

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

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