2013-01-31 20 views
6

क्या चयनित सेल के लिए सेल दृश्य को प्रतिस्थापित करना संभव है? मैंने अपने नियंत्रक को डेटा स्रोत और प्रतिनिधि के रूप में पंजीकृत किया है। सेल दृश्य, पंक्ति संख्या, चयन स्थिति, आदि के लिए अनुरोध, सभी अच्छी तरह से आते हैं। सेल चयन कॉलबैक में, मैं तालिका दृश्य को नए दृश्य के साथ सेल को पुनः लोड करने का प्रयास कर रहा हूं (वास्तविक डेटा नहीं!)। असल में, मैं चाहता हूं कि सेल दृश्य को अंतर्निहित डेटा का विस्तार और दिखाया जाए, यदि यह चुना गया है। समस्या यह है कि मुझे कोई संकेत नहीं है कि तालिका दृश्य को मेरे नियंत्रक से नए दृश्य के लिए कैसे पूछें। मैं देख सकता हूं कि दृश्य सेल ऊंचाई का अनुरोध कर रहा है, लेकिन कुछ भी नहीं।UITableView, चयन पर सेल दृश्य को प्रतिस्थापित करें

दृश्य पर कॉलिंग पुनः लोड करना डेटा काम करता है, लेकिन यह अक्षम है और इसकी अपनी समस्याओं (एनीमेशन संभावनाएं, चयन स्थिति बनाए रखने आदि) के सेट के साथ आता है।

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

तो फिर तुम फिर से लोड करने के लिए केवल अपने अद्यतन सेल निर्दिष्ट कर सकते हैं:

उत्तर

14

यहाँ कस्टम दृश्य से निपटने के लिए होगा दृष्टिकोण मैं करने के लिए ले जाएगा है यह करो।

@property (nonatomic, strong) NSIndexPath *selectedIndexPath; 

आपके नियंत्रक को एनएसआईएनएक्सएक्सपाथ प्रकार की एक संपत्ति सेट करने के लिए सेट करें जो कि इंडेक्स पथ का चयन किया गया था।

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    self.selectedIndexPath = indexPath; 
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationNone]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if ([indexPath compare:self.selectedIndexPath] == NSOrderedSame) { 
     // Create your custom cell here and return it. 
    } 
    else { 
     // Should create a normal cell and return it. 
    } 
} 

बिल्कुल

। ध्यान दें कि आप शायद अचयनित करना चाहते हैं। स्विफ्ट में पूरा कोड यहां दिया गया है। उपयुक्त के रूप में CellForRowAtIndexPath में चयनित इंडेक्सपैथ का उपयोग करें।

// TableViewController आयात UIKit चयन

वर्ग SelectingTableViewController: UITableViewController
{ आंतरिक वर selectedIndexPath: NSIndexPath? = शून्य

override func viewDidLoad() 
    { 
    super.viewDidLoad() 
    tableView.estimatedRowHeight = 68.0 
    tableView.rowHeight = UITableViewAutomaticDimension 

    self.clearsSelectionOnViewWillAppear = false; 
    } 

override func tableView 
    (tableView:UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) 
     { 
     print("did select....") 

     // in fact, was this very row selected, 
     // and the user is clicking to deselect it... 
     // if you don't want "click a selected row to deselect" 
     // then on't include this clause. 
     if selectedIndexPath == indexPath 
      { 
      print("(user clicked on selected to deselect)") 
      selectedIndexPath = nil 
      tableView.reloadRowsAtIndexPaths(
       [indexPath], 
       withRowAnimation:UITableViewRowAnimation.None) 

      tableView.deselectRowAtIndexPath(indexPath, animated:false) 
      return 
      } 

     // in fact, was some other row selected?? 
     // user is changing to this row? if so, also deselect that row 
     if selectedIndexPath != nil 
      { 
      let pleaseRedrawMe = selectedIndexPath! 
      // (note that it will be drawn un-selected 
      // since we're chaging the 'selectedIndexPath' global) 
      selectedIndexPath = indexPath 
      tableView.reloadRowsAtIndexPaths(
       [pleaseRedrawMe, indexPath], 
       withRowAnimation:UITableViewRowAnimation.None) 
      return; 
      } 

     // no previous selection. 
     // simply select that new one the user just touched. 
     // note that you can not use Apple's willDeselectRowAtIndexPath 
     // functions ... because they are freaky 
     selectedIndexPath = indexPath 
     tableView.reloadRowsAtIndexPaths(
      [indexPath], 
      withRowAnimation:UITableViewRowAnimation.None) 

     } 

} 
2

आप कोशिश की है। आप यह भी याद या के साथ पुनः लोड पर चयन स्थिति में भूल करने के लिए अपने tableview बता सकते हैं:

tableViewController.clearsSelectionOnViewWillAppear = NO; 

तो फिर तुम भी अंदर

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 

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

  • कोई संबंधित समस्या नहीं^_^