2012-05-18 9 views
28

मेरे पास UIView है जो दो UITableViews प्रदर्शित करने की आवश्यकता होगी, लेकिन SegementedBar का उपयोग कर उन्हें कभी भी एक साथ नहीं दिखाया जा सकता है, आप एक या दूसरे को टॉगल कर सकते हैं।2 UITiewViews एक UIView

इसे संभालने का सबसे अच्छा तरीका क्या होगा? बस एक Table View Controller बनाएं और डेटा स्रोत बदलें, या 2 Table View Controllers बनाएं और जब कोई अन्य दिखाई दे तो बस छुपाएं।

2 टेबल में विभिन्न कस्टम कक्षों के साथ एक पूरी तरह से अलग लेआउट होगा।

उत्तर

48

मैं एक डेटास्रोत & प्रतिनिधि रखूंगा।

इसका मतलब यह है कि सभी प्रतिनिधि/डेटा स्रोत के तरीकों और अधिक जटिल हो जाते हैं, लेकिन इसका मतलब है कि आप ViewController & दृश्य के बीच एक रिश्ते के लिए एक बनाए रखने कर सकते हैं।

तालिका से प्रत्येक दृश्य के

//vc.h 
@property (nonatomic, weak) IBOutlet UITableView* firstTableView; 
@property (nonatomic, weak) IBOutlet UITableView* secondTableView; 

डेटा स्रोत/प्रतिनिधि तरीकों आप तथ्य यह है कि विधि है जिस पर तालिका दृश्य प्रयोग में है निर्भर करता है अलग ढंग से व्यवहार करने की जरूरत है के लिए खाते में करने की जरूरत है में के लिए एक संदर्भ रहते हैं। जैसे

//vc.m 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ... 

    if (tableView == self.firstTableView) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

return cell; 

}

+0

धन्यवाद, हालांकि मेरे पास ऋषि की पोस्ट जैसी ही चिंताएं हैं, यह जटिल कोड संरचना का कारण बन सकती है, लेकिन यह मुझे बहुत से डबल कोड भी बचा सकती है। –

+0

बोनस यह है कि आपके पास दो नियंत्रक नहीं हैं, जो एक दृश्य को नियंत्रित करते हैं जो गलत हो जाने पर वास्तविक दर्द हो सकता है ... – Damo

+1

+1 - यह कार्यान्वयन यूआईएसearchDisplayController का उपयोग करने के लिए ऐप्पल के डिज़ाइन पैटर्न को अनुकूलित करने और अनुसरण करने के लिए बहुत आसान है। – CaptainRedmuff

4

दोनों दृष्टिकोणों में कुछ पेशेवर और विपक्ष हैं, लेकिन मैं व्यक्तिगत रूप से दो अलग नियंत्रक होने के दृष्टिकोण को प्राथमिकता दूंगा।

दृष्टिकोण 1 - एक तालिका दृश्य नियंत्रक बना सकते हैं और डेटा स्रोत

  • अतिरिक्त और बार-बार कोड से बचने में यह दृष्टिकोण मदद बदल जाते हैं।
  • इस मेमोरी प्रबंधन के साथ केवल एक नियंत्रक का उपयोग करने के लिए अच्छा है। (हालांकि यह तब तक बड़ी चिंता नहीं है जब तक हमारे पास बहुत अधिक डेटा नहीं होगा।)
  • इसके साथ समस्या जटिलता है।

दृष्टिकोण 2 - 2 टेबल देखें नियंत्रक

  • इस दृष्टिकोण के साथ निश्चित रूप से अतिरिक्त और बार-बार कोड है।
  • लेकिन इसके साथ कम जटिलता है।
+1

मुझे वही चिंताएं थीं, जबकि पहला दृष्टिकोण मुझे बहुत सी कोड बचाएगा, मुझे चिंता है कि यह एक जटिल कोड संरचना का कारण बन सकता है। –

+1

@woutr_be - यही कारण है कि मैंने कहा कि मैं दूसरा पसंद करूंगा, क्योंकि मैं अतिरिक्त जटिलता से बचना चाहता हूं। – rishi

+0

धन्यवाद, अभी के लिए मैं पहले दृष्टिकोण के लिए जाऊंगा, अगर यह बहुत जटिल हो जाता है तो भी मैं स्विच कर सकता हूं। –

0

उपयोग अलग UITableViewControllers और विचारों स्वैप। यह कम कोड, कम जटिलता है और यह ऐप्पल टैबबार के साथ करता है।

कोड जटिलता के लिए, वास्तव में कोई भी नहीं है। आप बस दृश्य बदलने के लिए निम्नलिखित जब UISegmentedControl के मूल्य बदल गया है कार्य करें:

UIView *previousSuperview = myViewController1.view.superview; 
myViewController2.view.frame = myViewController1.view.frame; 
[myViewController1.view removeFromSuperview]; 
[previousSuperview addSubview:myViewController2.view]; 

वैकल्पिक रूप से, आप इसी दृश्य के hidden गुण सेट कर सकते हैं।

+0

मुझे पता है कि यह कुछ हद तक देरी है लेकिन मुझे इस उत्तर के लिए आपका समाधान पसंद है - मेरा एकमात्र प्रश्न अलग-अलग UITableViewControllers अभी भी अपने स्वयं के टेबल दृश्यों के लिए डेटा स्रोत के रूप में कार्य करता है –

+0

@MikeSimz हां, डिफ़ॉल्ट रूप से वे ऐसा करते हैं। हालांकि, यदि आप इसे 'UITableView' दोनों पर सेट करना चाहते हैं, तो आप एक सामान्य डेटा स्रोत का उपयोग कर सकते हैं। –

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

    ... 

    if (tableView.tag == 1) { 

     ... 

    } else { // tableView == self.secondTableView 

     ... 
    } 
} 

टैग .xib से असाइन किया जा सकता है। इसलिए .h फ़ाइल में UITableVeiw चर रखने की आवश्यकता नहीं है। दो .xib में तालिका दृश्य

4

जरूरत मेरे वर्तमान ऐप्लिकेशन में, मैं एक ही बार में मैंने एक भी UIViewController में 4 UITableView की आवश्यकता है, मैं उपयोगकर्ता द्वारा चयनित टैब पर आधारित है, एकल तालिका दिखाने के लिए है, चार तालिकाओं को जोड़ा गया क्योंकि जटिलता को कम करने के लिए मैंने चार अलग-अलग कस्टम सेल और कार्यक्षमता रखी है।

इसका मुख्य लाभ यह है कि, प्रत्येक बार आपको एक तालिका को अपडेट करने के लिए reloadData पर कॉल करने की आवश्यकता नहीं होती है। मुझे बस तालिका के शो & छिपाने के प्रवाह को सही तरीके से संभालने की आवश्यकता है। और मेरा विश्वास करो कि यह अच्छा लग रहा है। बिल्कुल फिसल नहीं रहा।

मेरे मामले में, मैं केवल कोड द्वारा चार टेबल बना रहा हूं। और मैं एक तरीका बनाता हूं जो मुझे पास किए गए टैग के आधार पर एक टेबल लौटाएगा।

मैं cellForRowAtIndexPath को विभिन्न कार्यों में कोड को विभाजित करके जितना छोटा हो सके रखता हूं।

+0

यह दिलचस्प लग रहा है .. इस प्रभाव को प्राप्त करने के लिए आप किस तरीके का उपयोग/संशोधित करते हैं? कोड उदाहरण महान होंगे। –

+0

@ डेविड डेलमोन्टे, मैं आपके साथ कोई उदाहरण साझा नहीं कर पाऊंगा। लेकिन आप एक विधि बना सकते हैं जो सभी तालिकाओं को छुपाएगा और केवल उस विशेष तालिका को दिखाएगा जिसके लिए आप खोज रहे हैं। 'CellForRowAtIndexPath' में आप प्रत्येक तालिका को अपने टैग से अलग कर सकते हैं। – Hemang

+0

मुझे हेमांग काम कर रहा है। बहुत बहुत धन्यवाद। –