2013-06-25 5 views
10

के बीच क्या अंतर है कभी-कभी मैं कुछ ऐप विस्तृत अनुकूलन के लिए UIViewController को उपclass करना चाहता हूं। उदाहरण के लिए। ऐसा कुछ जो नियंत्रकों को देखने के दौरान प्रदर्शन करना चाहिएDidLoad या viewWillAppear या तो।UIViewController और UITableViewController

स्वाभाविक रूप से मैं UIViewController को उप-वर्गीकृत करता हूं और वहां से जाता हूं और सभी दृश्य नियंत्रक उस से प्राप्त होते हैं। लेकिन कुछ नियंत्रक टेबल चलाते हैं। और उस उद्देश्य के लिए डिज़ाइन किया गया UITableViewController है।

तो मैं UITableViewController को भी उपclass और बस वही चीजें करते हैं। जो ओओपी शर्तों में सबसे बुद्धिमान बात नहीं प्रतीत होता है। और कोई एकाधिक वंशानुक्रम आदि

है और जैसा कि UITableViewController UIViewController से विरासत ...

अब क्यों मैं सिर्फ अपने ही तालिका दृश्य नियंत्रक कि मेरे बहुत ही दृश्य नियंत्रक से विरासत का निर्माण नहीं करतीं मैं अपने आप को पूछ रहा हूँ सबक्लास और सभी टेबल सामान जोड़ता है। लेकिन क्या है "सभी टेबल सामान"?

  • कंकाल कोड है जो xcode प्रत्येक नए तालिका दृश्य नियंत्रक को जोड़ता है। काफी आसान लेकिन इसे आसानी से कोड स्निपेट में ले जाया जा सकता है।
  • प्रोटोकॉल UITableViewDelegate और UITableViewDataSource की घोषणा है। आरामपसंद। उन विधियों के कार्यान्वयन को किसी भी तरह UITableViewController के प्रत्येक उप-वर्ग में पालन करना होगा।
  • प्रोटोकॉल में उन सभी अनिवार्य तरीकों के संभावित डिफ़ॉल्ट कार्यान्वयन संभवतः हैं। heightForRowAtIndexPath के लिए या नहीं के बराबर titleForHeaderInSection या 44.0f के लिए: इस तरह के numberOfSectionsInTableView के लिए 0 लौटने के रूप में (। हालांकि बुरा उदाहरण हो सकता है लागू करने होशियार बिल्कुल नहीं है कि)

तो स्पष्ट सामान के बावजूद, वहाँ किसी भी चमत्कार कि UITableViewController लेता हैं की देखभाल?

+0

उत्तर देने वाले सभी के लिए धन्यवाद। यह इस निश्चित वास्तुकला के फैसले पर बहुत मदद करता है। –

उत्तर

10

मैं अच्छी तरह से वर्ग दस्तावेज में परिभाषित किया गया है व्यवहार UITableViewController कहते हैं के सभी का मानना ​​है: https://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html

UITableViewController वर्ग एक नियंत्रक वस्तु एक तालिका दृश्य का प्रबंधन करता है कि पैदा करता है। यह निम्नलिखित व्यवहार लागू करता है:

• यदि एक nib फ़ाइल initWithNibName के माध्यम से निर्दिष्ट है: बंडल: विधि (जिसे सुपरक्लास UIViewController द्वारा घोषित किया गया है), UITableViewController निब फ़ाइल में संग्रहीत तालिका दृश्य लोड करता है। अन्यथा, यह सही आयामों और ऑटोरेसाइज़ मास्क के साथ एक कॉन्फ़िगर किए गए UITableView ऑब्जेक्ट बनाता है। आप तालिका दृश्य के माध्यम से इस दृश्य तक पहुंच सकते हैं।

• यदि तालिका दृश्य युक्त एक निब फ़ाइल लोड हो जाती है, तो डेटा स्रोत और प्रतिनिधि निब फ़ाइल (यदि कोई हो) में परिभाषित उन ऑब्जेक्ट्स बन जाते हैं। यदि कोई nib फ़ाइल निर्दिष्ट नहीं है या यदि nib फ़ाइल कोई डेटा स्रोत या प्रतिनिधि निर्दिष्ट नहीं करती है, तो UITableViewController डेटा स्रोत और तालिका दृश्य के प्रतिनिधि को स्वयं को सेट करता है।

• जब तालिका दृश्य पहली बार प्रदर्शित होने वाला है, तो तालिका-दृश्य नियंत्रक तालिका दृश्य के डेटा को पुनः लोड करता है। यह तालिका चयन प्रदर्शित होने पर प्रत्येक चयन (अनुरोध के आधार पर एनीमेशन के साथ या बिना) को भी साफ़ करता है। UITableViewController क्लास सुपरक्लास विधि दृश्य में लागू करता है WillAppear:। आप clearsSelectionOnViewWillAppear प्रॉपर्टी में मान को बदलकर इस व्यवहार को अक्षम कर सकते हैं।

• जब तालिका दृश्य दिखाई देता है, तो नियंत्रक तालिका दृश्य के स्क्रॉल संकेतक को चमकता है। UITableViewController क्लास superclass विधि viewDidAppear में लागू करता है:।

• यह सुपरक्लास विधि सेट एडिटिंग का उपयोग करता है: एनिमेटेड: ताकि यदि कोई उपयोगकर्ता नेविगेशन बार में एक संपादन | पूर्ण बटन टैप करता है, तो नियंत्रक तालिका के संपादन मोड को टॉगल करता है।

ये सभी व्यवहार हैं जो आपके विशिष्ट नियंत्रक और तालिका दृश्य पर लागू होने पर पुन: कार्यान्वित करना आसान होना चाहिए।

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

+0

धन्यवाद। निष्पादन योग्य लगता है और फ्यूच्युरे परियोजनाओं के लिए भी एक अच्छा निवेश पसंद है। क्या आप किसी भी अच्छे कोड के बारे में जानते हैं जो UITableView को उपस्थापित कर सकता है? –

+0

@ जोनाह आप UIViewController में आखिरी तीन गोलियों को मैन्युअल रूप से कैसे कार्यान्वित करते हैं (यानी तालिका दृश्य प्रदर्शित होने पर हर बार स्पष्ट चयन, तालिका दृश्य के स्क्रॉल संकेतक को फ़्लैश करें जब तालिका दृश्य दिखाई देता है, और सुपरक्लास विधि सेट एडिटिंग को कार्यान्वित करें: एनिमेटेड: ओ टॉगल करें तालिका का संपादन मोड)? वर्तमान में जब मैं टेबलव्यू पर वापस आ जाता हूं, तो मेरी कोशिकाएं हाइलाइट रहती हैं, स्क्रॉल बार फ़्लैश नहीं होते हैं, और संपादन बटन दबाकर बिल्कुल कुछ भी नहीं होता है (यह बटन के पाठ को भी पूर्ण नहीं करता है)। क्या आप कृपया इन सवालों के लिंक या स्पष्टीकरण के साथ अपने उत्तर में संपादित कर सकते हैं? – golddove

+0

@golddove मैं समाधान की पेशकश करने में अनिच्छुक हूं जो समस्या को समझने पर छोड़ देता है इसलिए मुझे यकीन नहीं है कि कोड उदाहरण यहां उपयोगी होंगे।अगर मैं फ्लैशिंग स्क्रॉल संकेतक को कार्यान्वित करने के बारे में अनिश्चित था, तो मैं 'UITableView' के लिए क्लास प्रलेखन को देखकर शुरू कर सकता हूं, जो किसी भी तत्काल समाधान की पेशकश नहीं करता है लेकिन मुझे लगता है कि यह अधिक सामान्य' UIScrollView' का उप-वर्ग है। 'UIScrollView' में' फ्लैशस्क्रॉल इंडिकेटर 'विधि है। नियंत्रक के 'viewDidAppear' के अंदर उस विधि को कॉल करना' UITableViewController' में दिखाई देने वाले व्यवहार को पुन: उत्पन्न करता है। – Jonah

0

ऐसा लगता है कि UITableViewController बहुत सारे प्रबंधन मुद्दों का ख्याल रखता है जो वास्तव में आप केवल अपने लिए कर सकते हैं यदि आप चाहते हैं। the documentation की जाँच करें - स्पष्ट सामान के बावजूद यह स्वचालित रूप से आप के लिए एक UITableView पैदा करेगा, यह फिर से लोड, आदि

+0

"UITableView कई प्रबंधन मुद्दों का ख्याल रखता है" - मुझे लगता है कि आप UITableViewController का मतलब है? इसके अलावा, लेखक ने बताया कि उनका मतलब है कि 'स्पष्ट सामान के बगल में' आप लिख रहे हैं। – Vive

3

तो, वहाँ किसी भी चमत्कार कि UITableViewController का ख्याल रखता है कर रहे हैं?

ऐसा नहीं है कि मुझे पता है। जहां तक ​​मुझे पता है कि UITableViewController अधिकतर सुविधा वर्ग है जिसे आपके स्वयं के सबक्लास के साथ प्रतिस्थापित किया जा सकता है जो कोड की कुछ पंक्तियों को जोड़ता है।

Apple's class documentation बहुत कुछ कहता है कि UITableViewController करता है (और मैं इसे दोहराना नहीं चाहता क्योंकि यह भविष्य में अच्छी तरह से बदल सकता है)। कभी-कभी, अतिरिक्त जानकारी को 'हेडर फ़ाइल' से प्राप्त किया जा सकता है, लेकिन UITableViewController.h के मामले में स्रोत कोड टिप्पणियां केवल कक्षा दस्तावेज़ों में पहले से ही दोहराई जाती हैं।

अंत में आपको अपने आप को तय करना होगा कि आप अपने स्वयं के उप-वर्ग में क्या प्रतिलिपि बनाना चाहते हैं। शायद आपके प्रोजेक्ट की आवश्यकता नहीं है। एनआईबी हैंडलिंग? या आपके टेबल दृश्यों में से कोई भी संपादन योग्य नहीं है? तो बस कोड न करें ...

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