2014-08-31 8 views
9

बिना मैं आइटम के साथ एक _TableView है, और मुझे स्वत: ताज़ा सेट करना चाहते हैं, और मैं इसे ताज़ा करने पर स्क्रॉल करने के लिए नहीं करना चाहते हैं, मान लीजिए कि उपयोगकर्ता 2 पृष्ठ नीचे स्क्रॉल, और ताज़ा trigered -> मैं इतना interupting उपयोगकर्ता के स्क्रॉलUITableView ताज़ा स्क्रॉल

मान लें उपयोगकर्ता पंक्ति 18 पर था और अब _dataSource ताज़ा किया जाता है तो यह 4 आइटम कहते हैं की सुविधा देता है लाए जाने के बिना तालिका के शीर्ष पर ताजा सामग्री रखना चाहते हैं, तो मैं उपयोगकर्ता मद पर रहना चाहता हूँ वह था।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या होगा ??

+0

आशा उन प्रश्नों के उत्तर में मदद मिलेगी: http://stackoverflow.com/questions/5872759/uitableview-insert-rows-without-scrolling/11585557#11585557 – stosha

उत्तर

9

मैं दिखा रहा हूं कि केवल एक पंक्ति जोड़ दी जा रही है। आप इसे कई पंक्तियों तक बढ़ा सकते हैं।

// dataArray is your data Source object 
    [dataArray insertObject:name atIndex:0]; 
    CGPoint contentOffset = self.tableView.contentOffset; 
    contentOffset.y += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 
    [self.tableView reloadData]; 
    [self.tableView setContentOffset:contentOffset]; 

लेकिन इसके लिए आप - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath विधि को परिभाषित किया है की जरूरत है काम करने के लिए। अन्यथा, यदि आप स्थिर हैं तो आप सीधे अपनी टेबलव्यू पंक्ति ऊंचाई दे सकते हैं।

+0

यह स्थिर नहीं है, और यदि आपका जवाब मैं के लिए धन्यवाद इसे आज़माएं, – ColdSteel

+0

हां तो निश्चित रूप से आपने '- (CGFloat) तालिका की विधि परिभाषित की है: (UITableView *) तालिका देखें ऊंचाईफॉररोएट इंडेक्सपैथ: (एनएसआईएनएक्सएक्सपाथ *) इंडेक्सपाथ। अगर उसने आपकी मदद की है तो मेरा जवाब स्वीकार करें। – user1190882

2

मैं इसे इस तरह से कर रहा हूँ:

messages.insertContentsOf(incomingMsgs.reverse(), at: 0) 
table.reloadData() 

// This is for the first load, first 20 messages, scroll to bottom 
if (messages.count <= 20) { 
     let indexToScroll = NSIndexPath(forRow: saferSelf.messages.count - 1, inSection: 0) 
     table.scrollToRowAtIndexPath(indexToScroll, atScrollPosition: .Top , animated: false) 
} 
// This is to reload older messages on top of tableview 
else { 
     let indexToScroll = NSIndexPath(forRow: incomingMsgs.count, inSection: 0) 
     table.scrollToRowAtIndexPath(indexToScroll, atScrollPosition: .Top , animated: false) 
     // Remove the refreshControl.height + tableHeader.height from the offset so the content remain where it was before reload 
     let theRightOffset = CGPointMake(0, table.contentOffset.y - refreshControl.frame.height - table.headeView.frame.height) 
     table.setContentOffset(theRightOffset, animated: false) 
} 

... भी, के बाद से मैं गतिशील सेल ऊंचाई का उपयोग करें, कुछ weirdness से बचने के लिए, आकलन कैश किया गया है:

var heightAtIndexPath = [NSIndexPath: CGFloat]() 
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return heightAtIndexPath[indexPath] ?? UITableViewAutomaticDimension 
} 
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    heightAtIndexPath[indexPath] = cell.frame.height 
} 
12

यह वह जगह है UITableViewAutomatic आयाम का उपयोग करते समय आईओएस 8 की त्रुटि। हमें टेबल की सामग्री ऑफसेट, रीलोड टेबल, फोर्स लेआउट स्टोर करना होगा और वापस कॉन्फ़ेन सेट करना होगा।

CGPoint contentOffset = self.tableView.contentOffset; 
[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
[self.tableView setContentOffset:contentOffset]; 
+0

आईओएस 8 के बारे में पहली पंक्ति मेरे दिन को बचाती है। – CRDave

16

स्विफ्ट के लिए 3+:

आप वर्तमान UITableView की भरपाई बचाने तो फिर से लोड और फिर सेट UITableView पर वापस ऑफसेट करने के लिए की जरूरत है।

मैं इस उद्देश्य के लिए इस समारोह बनाया है:

func reload(tableView: UITableView) { 

    let contentOffset = tableView.contentOffset 
    tableView.reloadData() 
    tableView.layoutIfNeeded() 
    tableView.setContentOffset(contentOffset, animated: false) 

} 

, बस से कॉल करने की: reload(tableView: self.tableView)

+0

क्या होगा अगर टेबलव्यू ऑफसेट को बदल नहीं देता है फिर भी नई कोशिकाओं को लोड करता है? –

+0

@ रॉक बाल्बाओ - मैं आपके प्रश्न को समझ नहीं पा रहा हूं –

+0

मैं NSFetchedResultsControllerDelegate का उपयोग कर रहा हूं। अब मैं स्क्रॉलडाउन पर पुरानी कोशिकाओं को लोड करने के लिए UIRefreshControl का उपयोग कर रहा हूं। प्रदर्शन पर डेटा लोड किया गया है मुझे केवल डेटा पुनः लोड करने की आवश्यकता है। लेकिन मैं पुनः लोड किए गए सेल्स को दिखाना नहीं चाहता हूं। उन्हें ऊपर लोड करने दें। जब मैं ऊपर स्क्रॉल करता हूं तो केवल वे दिखाई देते हैं। इसलिए इसे लागू करने के लिए मैंने इस सामग्री का उपयोग करने का प्रयास किया। लेकिन पुनः लोड करने से पहले और पुनः लोड करने के बाद सामग्री सामग्री ऑफसेट समान है हालांकि इसमें –

0

कोशिश

tableView.reloadRows (at: tableView!.indexPathsForVisibleRows!, with: .none) के साथ

reloadData को बदलने के लिए,

लेकिन आपको no cells पर ध्यान देना चाहिए, यदि no cells है, तो इस विधि को क्रैश होना चाहिए।

0

आप फिर से लोड करना चाहते हैं जब आपके पास करने के लिए

self.tableView.reloadData()

self.tableView।layoutIfNeeded()

है और यह भी इस UITableViewDelegate

समारोह tableView का उपयोग (_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { वापसी 'अपनी अधिकतम सेल की ऊंचाई' }

और अपने tableView स्क्रॉल किए बिना पिछली स्क्रॉल स्थिति पर बने रहेंगे

0

यह कोड अनावश्यक एनीमेशन को रोक देगा और स्क्रॉल व्यू की सामग्री ऑफसेट को बनाए रखेगा, यह मेरे लिए ठीक काम करता है।

let lastScrollOffset = tableView.contentOffset 
tableView.beginUpdates() 
tableView.reloadData() 
tableView.endUpdates() 
tableView.layer.removeAllAnimations() 
tableView.setContentOffset(lastScrollOffset, animated: false) 
संबंधित मुद्दे