2010-09-19 18 views
53

मेरे पास शीर्ष स्तर UIViewController है जिसमें UITableView है। शीर्ष स्तर UIViewControllerNavigationController को तुरंत चालू करता है, और NavigationController पर UIViewController को धक्का देता है। अर्थात। हम एक नए, दूसरे दृश्य में धक्का देते हैं। इस दूसरे दृश्य में ऊपरी बाएं कोने में सामान्य "बैक" बटन होता है ताकि आप शीर्ष स्तर के दृश्य पर वापस जा सकें।वापस नेविगेट करते समय UITableView को फिर से लोड करें?

क्या यह संभव है, दूसरे दृश्य से शीर्ष स्तर दृश्य पर वापस जाने के लिए, शीर्ष स्तर पर पर कॉल करके, दूसरे दृश्य में उत्पन्न डेटा का उपयोग करके शीर्ष स्तर दृश्य में UITableView को फिर से निकालने के लिए, और यदि ऐसा है, कोई इसे कैसे करता है?

उत्तर

105

आपको बस इतना करना है (आपके UIViewController में जिसमें UITableView है)। इस बिंदु पर सेल-स्तर पर क्या होता है इसके बारे में आपको चिंता करने की ज़रूरत नहीं है।

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.tableView reloadData]; // to reload selected cell 
} 

बस अपने नियंत्रक को ऊपर कोड जोड़ें, और आप देखेंगे कि जब आप अपने दूसरे दृश्य से वापस आते हैं तो सही चीज होती है। reloadData पर कॉल तालिका दृश्य को बताता है कि इसे अपने मॉडल से अपनी कोशिकाओं को रीफ्रेश करने की आवश्यकता है, और बाकी सब कुछ अच्छी तरह से पालन करता है।

+1

के लिए अपडेट किया गया मैं इस विधि का इस्तेमाल किया है, लेकिन के रूप में वे जहां दोनों प्रारंभिक लोड पर फायरिंग viewWillAppear करने के लिए अपने didViewLoad से कोड को स्थानांतरित करने के लिए किया था। मेरे लिए यह एक बड़ी समस्या थी क्योंकि मुझे वेब सेवा से नए आइटम विवरण डाउनलोड करने की आवश्यकता है – PowerMan2015

5

आप UINavigationControllerDelegate के तरीकों को लागू कर सकते हैं और दृश्य नियंत्रकों को पॉप करते समय ताज़ा करने के लिए तर्क बना सकते हैं।

ऐसा करने का एक और तरीका पॉपअप व्यू कंट्रोलर के डेटा के आधार पर रीफ्रेश करने के लिए viewWillAppear पर कुछ तर्क पर आपके टेबल व्यू कंट्रोलर पर लागू होगा।

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

10

आप केवल सेल का चयन किया गया फिर से लोड करना चाहते हैं, तो जैसे UITableViewController के अपने कस्टम उपवर्ग में viewWillAppear: ओवरराइड:

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; 
    [super viewWillAppear:animated]; // clears selection 
    if (selectedRowIndexPath) { 
     [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
    } 
} 

नोट: मान लें कि आप clearsSelectionOnViewWillAppear सेट YES लिए (डिफ़ॉल्ट) छोड़ दिया है, super पर कॉल करने से पहले आपको चयनित पंक्ति का इंडेक्स पथ प्राप्त करना होगा, जो चयन को साफ़ करता है।

इसके अलावा, solution of @ZoranSimic को केवल [self.tablView reloadData] पर कॉल करने के लिए स्वीकार्य है क्योंकि यह कम कोड और अभी भी कुशल है।

अंत में, शायद सबसे अच्छा तरीका है मॉडल वस्तुओं वे प्रतिनिधित्व के साथ सिंक में अपने तालिका दृश्य की कोशिकाओं को रखने के लिए NSFetchedResultsController की तरह करते हैं और जब मॉडल अपने तालिका दृश्य नियंत्रक को सूचित करने की-वैल्यू को देख (KVO) और/या NSNotification उपयोग करने के लिए है ऑब्जेक्ट्स बदल गए हैं ताकि यह संबंधित कोशिकाओं को फिर से लोड कर सके। टेबल व्यू कंट्रोलर viewDidLoad में अपने मॉडल ऑब्जेक्ट्स में बदलावों को देखना शुरू कर सकता है और dealloc (और कहीं भी आप manually unload self.view) में देख रहे हैं।

6

answer of Zoran Simic यहां स्विफ्ट कोड के अलावा:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    tableView.reloadData() 
} 
+0

'viewDidLoad()' से डेटा प्राप्त न करने के लिए सावधान रहें, जब आप 'viewWillAppear()' से डेटा पुनः लोड करना चाहते हैं। –

1

हो सकता है कि अब कर सकते हैं।

के लिए स्विफ्ट 2 +

अपने viewDidAppear विधि में:

आप सभी तालिका को फिर से लोड करना चाहते हैं:

tableView.reloadData() 

आप केवल सेल का चयन फिर से लोड करना चाहते हैं।

let index = tableView.indexPathForSelectedRow 
if (index != nil){ 
    self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic) 
} 
2

viewWillAppear हर बार दृश्य दिखाई देने पर पहली बार शामिल होता है। यहाँ केवल देखने के लिए जब आप वापस नेविगेट

मैं जाँच पहली बार मैं इस ViewController जाने या जब मैं वापस नेविगेट

@property (nonatomic) BOOL isViewExist; 
यह है कि के लिए मेरे ViewController की .h file में एक चर बनाने को फिर से लोड के लिए मेरे समाधान है

कि में viewWillAppear

-(void)viewWillAppear:(BOOL)animated{ 
    if(!self.isViewExist){ 
     self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything 
    }else{ 
     [self.tableView reloadData]; // to reload the tableview data 
     // or your can refresh anything in your ViewController as you want 
    } 
} 

आशा इस मदद के बाद

-1

स्विफ्ट 3

let index = tableView.indexPathForSelectedRow 
    if (index != nil){ 
     self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic) 
    } 
+0

_in - func view ओवरड्राइड() या ??? _ - उपयोगकर्ता की ओर से टिप्पणी करना जो टिप्पणी नहीं कर सकता – Tushar

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