2012-10-09 15 views
6

मैं अपने आवेदन में UIRefreshControl को लागू करने की कोशिश कर रहा हूं। मेरे पास एक xib फ़ाइल है और मैंने खाली निब फ़ाइल में UITableViewController जोड़ा और मैंने रीफ्रेश प्रॉपर्टी को "सक्षम" पर सेट किया। इसके अलावा मैंने viewDidLoad और कस्टम रीफ्रेश विधि में कोड जोड़ा है। समस्या मैं एक त्रुटि मैं पर कोई जानकारी प्राप्त नहीं कर सकते हैं .... मेरी viewDidLoad मैं "संपत्ति 'refreshControl' प्रकार ViewController की वस्तु पर नहीं मिला" मिलता हैUIRefreshControl मुद्दे

- (void)viewDidLoad{ 

[super viewDidLoad]; 

self.myTableView = 
[[UITableView alloc] initWithFrame:self.view.bounds 
          style:UITableViewStyleGrouped]; 

self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
            UIViewAutoresizingFlexibleHeight; 

self.myTableView.delegate = self; 
self.myTableView.dataSource = self; 

[self.view addSubview:self.myTableView]; 

UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
[refresh addTarget:self action:@selector(refreshView:) forControlEvents:UIControlEventValueChanged]; 

self.refreshControl = refresh; 

} 

-(void)refreshView:(UIRefreshControl *)refresh { 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."]; 

// custom refresh logic would be placed here... 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MMM d, h:mm a"]; 
NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@", 
           [formatter stringFromDate:[NSDate date]]]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated]; 
[refresh endRefreshing]; 

} 

मुझे पता नहीं क्यों कि है संपत्ति उपलब्ध नहीं है .... मुझे क्या याद आ रही है?

ऐसा लगता है कि मुझे ViewController.h फ़ाइल में UITableViewController से प्राप्त करने की आवश्यकता है। अगर मेरे पास पहले से UITableView है तो मैं दोनों से कैसे प्राप्त करूं? अगर मैं ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>ViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> करने से मेरे कोड बदलने तो मैं कोई त्रुटि मिलती है:

error: NSInternalInconsistencyException', 
    reason: '-[UITableViewController loadView] loaded the "ViewController_iPhone" nib but didn't get a UITableView.' 

उत्तर

11

आप अपने UITableView करने के लिए एक subview के रूप UIRefreshControl जोड़ सकते हैं।

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

डेव की टिप्पणी के अनुसार, यह आईओएस के भविष्य के संस्करण में तोड़ सकता है। तो कृपया इसका उपयोग करते समय सावधान रहें और इसके बारे में bug report to apple बढ़ाने का प्रयास करें।

अद्यतन: एक बेहतर दृष्टिकोण self के ChildViewController रूप UITableViewController जोड़ने और फिर self.view की subview के रूप tableViewController.tableView जोड़कर है। इस तरह से काम करने के लिए आपको किसी भी हैक को नहीं करना है।

[self addChildViewController:tableViewController]; 
[self.view addSubview:tableViewController.tableView]; 

आप तदनुसार tableView के लिए फ्रेम को परिभाषित कर सकते हैं। इस दृष्टिकोण का उपयोग करके, UIRefreshControl उसी तरह काम करना चाहिए जैसा यह UITableViewController के लिए काम करता है। `

+3

यह असमर्थित है और आईओएस के भविष्य के संस्करण में तोड़ सकता है। 'UIRefreshControl' का उपयोग करने का एकमात्र समर्थित तरीका' UITableViewController' के साथ है। –

+1

@ एसीबी, यही वही है जो मुझे चाहिए !!! धन्यवाद लाखों। काश मैं आपको अधिक समर्थक दे सकता हूं! – brianhevans

+1

हां, आपके पास UIViewController क्लास पर UITefreshCiewrol हो सकता है और UITableView और जिसे आपने मैन्युअल रूप से जोड़ा है। अन्य उत्तरों की टिप्पणियां सच हो सकती हैं (यह दस्तावेज़ों के साथ नहीं जाती है), लेकिन यह छोटा हैक आईओएस 6 पर काम करता है। –

1

आपका ViewController वर्ग आदेश refreshControl संपत्ति का उपयोग करने की में UITableViewController का एक उपवर्ग होना चाहिए।

+0

हम बच्चे दृश्य नियंत्रक के रूप में 'UITableViewController' जोड़ सकते हैं और फिर वर्तमान दृश्य नियंत्रक के 'self.view' के उप-दृश्य के रूप में' tableview' 'जोड़ सकते हैं, है ना? मैं बस सोच रहा था कि क्या हमें वास्तव में उपclass की आवश्यकता है? – iDev

+0

@ACB हां, आप एक बच्चे दृश्य नियंत्रक के रूप में 'UITableViewController' का उपयोग कर सकते हैं। यह एक उत्कृष्ट दृष्टिकोण है। –

+0

पुष्टि करने के लिए धन्यवाद। मैं आपके उत्तर में इस कथन से उलझन में था *** "व्यू कंट्रोलर क्लास UITableViewController का उप-वर्ग होना चाहिए" *** क्योंकि हम इसे सबव्यू के रूप में भी जोड़ सकते हैं। – iDev

5

चीज़ें याद रखें:

  • UIRefreshControl केवल UITableViewController के लिए है, तो आपके वर्ग UITableViewController के उपवर्ग होना चाहिए।

  • UITableViewController एक संपत्ति refreshControl है, तो आपको एक UIRefreshControl आवंटित और है कि संपत्ति के लिए यह निर्धारित करना चाहिए।

पूर्व:

UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; 

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 

[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged]; 

tableViewController.refreshControl = refreshControl; 
+0

यह सही जवाब है। स्वीकार्य उत्तर के अनुसार मैन्युअल रूप से इसे 'UITableView' में जोड़कर आईओएस के भविष्य के संस्करणों में अप्रत्याशित व्यवहार हो सकता है। – Samah

0

मैं तुम्हें myTableView के लिए अलग UITableViewController उपवर्ग बनाने के लिए सिफारिश करेंगे। और फिर उस दृश्य को मूल व्यू कंट्रोलर के भीतर जोड़ने के लिए addChildviewController या iOS6 कंटेनर व्यू का उपयोग करके। इस तरह से दृश्य के हिस्से में भी, आप UIRefreshControl का उपयोग कर सकते हैं।

स्वीकृत उत्तर आधिकारिक तरीका नहीं है, इसलिए भविष्य की रिलीज में यह तोड़ सकता है क्योंकि टिप्पणी ने कहा ...

2

ये सभी कुछ सरल करने के जटिल तरीके हैं।

आपको रीफ्रेश नियंत्रण जोड़ने की आवश्यकता नहीं है, या अपने दृश्य नियंत्रक में एक घोषित करने की आवश्यकता नहीं है। पुल-टू-रीफ्रेश जोड़ना दो-चरणीय प्रक्रिया है।
चरण 1: अपने स्टोरीबोर्ड में, अपनी तालिका पर जाएं व्यू कंट्रोलर और, जहां यह "ताज़ा" कहता है, "सक्षम" चुनें।
चरण 2: अपने tableViewController.m फ़ाइल में निम्न कोड जोड़ें, viewDidLoad में:

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

कि पूरी प्रक्रिया में अपने -refresh विधि में कोई काम कर के अलावा अन्य है। जब आप इसे रीफ्रेश करना बंद करना चाहते हैं, तो [self.refreshControl endRefreshing]; पर कॉल करें।

+0

धन्यवाद! मुझे लगा कि मैं पढ़ रहा था सभी ट्यूटोरियल अधूरा थे। –

संबंधित मुद्दे