2016-07-27 5 views
11

का उपयोग करते समय मेरे पास एक तालिका दृश्य नियंत्रक है UISearchController जो tableView.tableHeaderView के रूप में सेट करता है। खोज परिणामों को अपडेट करते समय, मैं beginUpdates और endUpdates और तालिका दृश्य के लिए डेटा अपडेट करने के लिए संबंधित विधियों का उपयोग करता हूं।UISearchBar tableHeaderView से प्रारंभ होता है StartUpdates/endUpdates

इससे खोज बार गायब हो जाता है; tableHeaderView खोज बार के समान आकार के खाली, सामान्य UIView पर सेट है। अगर मैं पूरे beginUpdates/endUpdates प्रक्रिया के बजाय reloadData का उपयोग करता हूं, तो सब कुछ ठीक है।

तालिका दृश्य नियंत्रक नियमित दृश्य नियंत्रक में एम्बेड किया गया है; इसमें कोई नेविगेशन नियंत्रक शामिल नहीं है। इस तालिका दृश्य आवश्यक नियंत्रक की पूरी कार्यान्वयन समस्या को पुनः के लिए है:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; 
    self.searchController.searchResultsUpdater = self; 
    self.searchController.dimsBackgroundDuringPresentation = NO; 

    self.tableView.tableHeaderView = self.searchController.searchBar; 
} 

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController 
{ 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
} 

क्यों इस खोज पट्टी का कारण नहीं है एक खाली दृश्य के साथ प्रतिस्थापित किया जाना, और यह कैसे बचा जा सकता है?

+0

क्या आप पर और के अपने ViewController/नेविगेशन नियंत्रक पर "पारदर्शी" संपत्ति को बदलने की कोशिश? मुझे याद है कि मुझे यह समस्या एक बार थी, और अगर मुझे सही ढंग से "पारदर्शी" याद आया तो इसके साथ कुछ करने के लिए .. – MCMatan

उत्तर

0

जब आप पहली बार UISearchController's खोजबार पर क्लिक करते हैं, तो खोजबार को एनिमेट करने में लगभग 0.5 का समय लगता है। लेकिन self.tableView.endUpdates() को तत्काल प्रतिनिधि विधि द्वारा बुलाया गया था, एनीमेशन बाधित था।
Searchbar एनीमेशन के बीच में फंस गया, और आप इसे यूआई नहीं देख सकते हैं:
enter image description here

का संभावित हल करता है, तो Searchbar एनीमेशन में है की जाँच करने के लिए, और देरी self.tableView.endUpdates() जब यह में है।

func updateSearchResultsForSearchController(searchController: UISearchController){ 
    self.tableView.beginUpdates() 
    //Do some updates 

    if !searchController.searchBar.showsCancelButton{ 
     self.tableView.performSelector(#selector(UITableView.endUpdates), withObject: nil, afterDelay: 1) 

    }else{ 
     self.tableView.endUpdates() 
    } 
} 
+0

आपके उत्तर के लिए धन्यवाद। मुझे लगता है कि आप एनीमेशन के बारे में कुछ पर हैं। मैंने '[CATransaction setCompletionBlock:] 'जैसी चाल की कोशिश की है, लेकिन इसका कोई फायदा नहीं हुआ है। आपका कामकाज विशेष रूप से हैकी लगता है, और इसके अलावा मूल समस्या के लिए काम नहीं करता है। शायद क्योंकि यह मेरे द्वारा प्रदान किए गए पुनरुत्पादित उदाहरण के रूप में नहीं है, और 'startUpdates' और' endUpdates' के बीच अधिक काम करता है। –

+0

उस स्थिति में, आपको अपने 'UISearchController' को किसी अन्य तालिका व्यू कंट्रोलर के साथ जोड़ने की कोशिश करनी चाहिए, और इस दूसरी तालिका के साथ सभी अपडेट देखें ViewController। – wj2061

+0

'[[UISearchController alloc] initWithSearchResultsController: ...]' के रूप में? मुझे लगता है कि यह एक समाधान है, लेकिन मैं मूलभूत तालिका दृश्य, जैसे इशारे और इस तरह से जुड़ी सारी कार्यक्षमता को रखना चाहता हूं। यदि कोई अन्य तरीका नहीं है, तो कुछ भी रिफैक्टरिंग हल नहीं हो सकती है, हालांकि। –

0

लिटिल संशोधन के बारे में beginUpdates, endUpdates and reloadData

beginUpdates:: विधि की एक श्रृंखला कॉल डालने, हटाने, या चयन पंक्तियों और तालिका दृश्य के वर्गों शुरू होता है। यदि आप बाद में सम्मिलन, हटाना, और चयन संचालन चाहते हैं (उदाहरण के लिए, cellForRowAtIndexPath: और indexPathsForVisibleRows) को एनिमेटेड होने के लिए इस विधि को कॉल करें। सेल के पुनः लोड किए बिना पंक्ति ऊंचाई में परिवर्तन को एनिमेट करने के लिए आप एंडअपडेट्स विधि के बाद इस विधि का भी उपयोग कर सकते हैं। विधियों के इस समूह को एंडअपडेट्स के आमंत्रण के साथ निष्कर्ष निकालना चाहिए। इन विधि जोड़े को घोंसला किया जा सकता है। यदि आप इस ब्लॉक के अंदर सम्मिलन, हटाना और चयन कॉल नहीं करते हैं, तो पंक्ति गणना जैसे तालिका गुण अमान्य हो सकते हैं। आपको समूह के भीतर पुनः लोडडेटा नहीं कहना चाहिए; यदि आप समूह के भीतर इस विधि को कॉल करते हैं, तो आपको स्वयं को कोई एनीमेशन करना होगा।

एंडअपडेट्स: पंक्तियों की एक श्रृंखला को शामिल करता है जो तालिका दृश्य के पंक्तियों और खंडों को सम्मिलित, हटाएं, चुनते हैं या फिर से लोड करते हैं। आप इस विधि को स्टार्टअपडेट्स के साथ शुरू होने वाली विधि कॉल की एक श्रृंखला को ब्रैकेट करने के लिए कहते हैं और इसमें तालिका दृश्य के पंक्तियों और अनुभागों को सम्मिलित करने, हटाने, चुनने और पुनः लोड करने के लिए संचालन शामिल हैं। जब आप एंड अपडेट्स को कॉल करते हैं, तो UITableView एक साथ संचालन को एनिमेट करता है। StartUpdates और endUpdates के आमंत्रण घोंसला जा सकते हैं। यदि आप इस ब्लॉक के अंदर सम्मिलन, हटाना और चयन कॉल नहीं करते हैं, तो पंक्ति गणना जैसे टेबल गुण अमान्य हो सकते हैं।

पुनः लोडडाटा: तालिका दृश्य के पंक्तियों और खंडों को फिर से लोड करता है। कक्ष, सेक्शन हेडर और पाद लेख, इंडेक्स सरणी आदि सहित तालिका बनाने के लिए उपयोग किए जाने वाले सभी डेटा को पुनः लोड करने के लिए इस विधि को कॉल करें। दक्षता के लिए, तालिका दृश्य केवल उन पंक्तियों को फिर से प्रदर्शित करता है जो दिखाई दे रहे हैं।यदि रीलोड के परिणामस्वरूप तालिका घट जाती है तो यह ऑफसेट को समायोजित करता है। तालिका दृश्य का प्रतिनिधि या डेटा स्रोत इस विधि को कॉल करता है जब वह तालिका डेटा को पूरी तरह से लोड करने के लिए चाहता है। इसे उन विधियों में नहीं बुलाया जाना चाहिए जो पंक्तियों को सम्मिलित या हटाते हैं, खासकर कॉल के साथ लागू एनीमेशन ब्लॉक के भीतर अद्यतन और एंड अपडेट्स।

अब खोज के मामले में हम नहीं जानते कि कौन-सी पंक्तियां हर बार खोज परिणाम डेटा अलग होगा और साथ ही प्रभावित करने के लिए जा रहे हैं, मेरा मानना ​​है कि एक

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 
इसके लिए प्रयोग किया जाता के रूप में

उपयोग नहीं करना चाहिए जब आप टेबलव्यू पर insert, update or delete ऑपरेशन कर रहे हैं और आप इसकी indexPath जानते हैं।

[self.tableView reloadData]; बेहतर उपयोग करें क्योंकि यह केवल तालिका दृश्य में दृश्य पंक्तियों या अनुभाग को अपडेट करेगा। Table Search with UISearchController के लिए ऐप्पल के नमूना कोड को भी देखें, यह reloadData का उपयोग करने की भी अनुशंसा करता है।

संबंधित परिवर्तन करें और आप जाने के लिए अच्छे हैं।

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

+0

मुझे पता है कि 'reloadData' का उपयोग करने से समस्या दूर हो जाती है, हालांकि यह स्पष्ट नहीं करता है कि कोई' startUpdates' और 'endUpdates' का उपयोग क्यों नहीं कर सकता है। –

+0

@ हावर्ड जो मैंने समझाया है, 'startUpdates और endUpdates' और' reloadData' का उपयोग कब करें। –

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