2011-06-06 14 views
7

ठीक करने के लिए "कनेक्ट" है एक तालिका दृश्य, मुझे पता है यह एक अस्पष्ट वैचारिक सवाल है, लेकिन मैं वास्तव में यहाँ मदद की जरूरत है। अगर आप इसे पढ़ने के लिए समय निकालने का फैसला करते हैं तो अग्रिम धन्यवाद। मैं इसे इतना लिखने पर भी विचार नहीं करता हूं सिवाय इसके कि यह इतना अच्छा मंच है कि इतने सारे सहायक लोगों के साथ मैंने सोचा कि यह पूछने का सबसे अच्छा स्थान होगा।मैं कैसे एक दृश्य नियंत्रक

यह सब सवाल यहाँ से संबंधित है (आप इसे देखने के लिए नहीं है - मैं नीचे सब कुछ समझाने): Pass parameter when initializing table

मैं एक ही समस्या पर दिनों के लिए काम कर रहा है, लेकिन मैं कर रहा हूँ यह महसूस करना कि मुझे कुछ बड़ा होना चाहिए। मैंने गुमराह किया है और गुगल किया है और मैंने कुछ दिन पहले दो ओब्जे-सी किताबें खरीदी हैं (और लगभग 50% पढ़ी हैं), लेकिन मैं अभी भी ऐसा कुछ समझ रहा हूं जो ऐसा लगता है कि यह अविश्वसनीय रूप से आसान होना चाहिए। मैं स्पष्ट रूप से ओओपी के लिए काफी नया हूं, लेकिन मेरे पास एचटीएमएल, पर्ल, एसक्यूएल, पायथन के साथ-साथ कुछ प्राचीन सामान जैसे पास्कल और मूल में मध्यम कौशल है। मैं एक n00b हूँ, लेकिन एक मूर्खता नहीं (ठीक है, वास्तव में यह अनुभव मेरे दिमाग को थोड़ा सा बदल रहा है)।

वैसे भी, मेरा अंतिम लक्ष्य केवल पहले दृश्य (स्तर 1) पर 8 "सामान्य" बटन के साथ एक ऐप बनाना है, प्रत्येक मूल रूप से वही काम करता है - जो एक साधारण तालिका दृश्य (स्तर 2) उन कोशिकाओं में डेटा के साथ जिन्हें विवरण (स्तर 3) पर ड्रिल करना जारी रखने के लिए क्लिक किया जा सकता है। बहुत बुनियादी और सीधा अवधारणा। 8 संभावित स्तर 2 के बीच एकमात्र अंतर वह डेटा है जो दिखाया जाएगा। मैंने पहले ही एसक्यूएल प्रश्नों का निर्माण किया है जो कि मैं प्रत्येक बटन के लिए काम करता हूं।

तो, यहाँ है मैं कहाँ खड़े हैं: मैं उस स्तर 2 से सब कुछ नीचे बिल्कुल के रूप में मैं उम्मीद करता है एक पूरी तरह से काम कर रहे एप्लिकेशन है - प्रश्नों काम करते हैं, टेबल सुंदर हैं - ताकि बढ़िया है।

इसके अलावा, मुझे लगता है कि "स्तर 1" पर लॉन्च किया है और मुझे 8 बटन (मैं स्तर 1 पर नेविगेशन बार छिपाने) से पता चलता है एक और नव-आधारित अनुप्रयोग है। यदि मैं स्तर 1 पर किसी भी बटन पर क्लिक करता हूं, तो स्तर 2 दृश्य (जो एक एनएवी बार + एक टेबल है) बिल्कुल वैसा ही दिखता है जैसा मैं चाहता हूं। समस्या यह है कि तालिका सिर्फ खाली है। कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, मुझे डेटा दिखाने के लिए दूसरे ऐप में स्तर 2 नहीं मिल सकता है, भले ही मैं पहले ऐप में उस डेटा को पूरी तरह दिखा सकता हूं। मुझे के जीवन के लिए, मैं समझ नहीं कैसे "लिंक" स्तर 2.

साथ स्तर 1 उम्मीद है कि आप इस अंतर को पाटने मैं कोशिश कर रहा हूँ समझ सकते हैं। स्तर 2 के लिए 8 संभावनाएं देखते हैं के बाद से (एक ही एसक्यूएल मेज पर एसक्यूएल प्रश्नों में केवल बहुत मामूली अंतर के साथ), मैं शुरू में के स्तर 2 को देखने के लिए एक पूर्णांक "गुजर" (पहले अनुप्रयोग में) एक तरह से साथ आ कोशिश की और फिर पारित होने के आधार पर एसक्यूएल क्वेरी का चयन करें (उस फियास्को के लिए उपरोक्त लिंक देखें)। एक बार जब मैं काम कर रहा हूं, तो मैंने यह पता लगाने की योजना बनाई कि बाद में बटन "गुजरने" कैसे करें। हालांकि, इसके साथ लगभग 16 घंटों के बाद, मैंने अभी छोड़ दिया और 8 अलग-अलग टेबल व्यू कंट्रोलर बनाने का फैसला किया, सभी क्वेरी को छोड़कर लगभग समान कोड के साथ। इस तरह, अगर मैं स्तर 1 पर केवल एक सिंगल बटन प्राप्त कर सकता हूं तो किसी भी पैरामीटर के साथ केवल स्तर 2 में से केवल एक को धक्का देने के लिए मैं एक भयानक लेकिन सफल प्रोग्रामर होगा।

दुर्भाग्य से, यहां तक ​​कि वह मेरे लिए बाहर काम नहीं किया है। मैंने इंटरफेस बिल्डर में सोचने के लिए हर संभावित नियंत्रण-ड्रैग और विंडो/व्यू/टेबल संयोजन की कोशिश की है, लेकिन कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, डेटा कभी भी तालिका दृश्य में लोड नहीं होता है, भले ही यह मेरे पहले ऐप में अच्छा काम करता हो। मैं कोड की हर पंक्ति से गुजर चुका हूं - वे कुछ समान हैं, सिवाय इसके कि किसी को स्तर 2 भाग "कॉल" या "लॉन्च" करना है और मुझे बस यह नहीं मिल रहा है।

तो, मैं यहां सम्मेलन/उम्मीदों के साथ तोड़ने जा रहा हूं और मेरे प्रश्न में कोई भी कोड पोस्ट नहीं कर रहा हूं। मैं बस जानना चाहता हूं - यह संभवतः इतना कठिन कैसे हो सकता है ?? मैं बहुत विश्लेषणात्मक रूप से दिमाग में हूं और मैं जल्दी से पकड़ता हूं, लेकिन मुझे कहना है कि मैंने कभी भी अपने जीवन में तकनीकी चुनौती से इतनी नम्रता नहीं की है।

क्या कोई मुझे वैचारिक स्तर पर समझा सकता है, मुझे यहां क्या करना है या मुझे क्या याद आ रहा है? यहां तक ​​कि यदि आप मुझे पढ़ने के लिए कुछ लिंक देते हैं तो भी मैं इसकी बहुत सराहना करता हूं। मैंने यूट्यूब पर कई घंटों के ट्यूटोरियल देखे हैं, लेकिन मैं हमेशा अधिक के लिए तैयार हूं।

बेशक मैं अपना कोड साझा करने के लिए तैयार हूं, लेकिन इसमें बहुत कुछ है और मैं इस पर इतना नया हूं कि मैं वास्तव में नहीं जानता कि प्रासंगिक भाग कहां हैं। इसके अलावा, मैं वास्तव में यह जानना चाहता हूं कि यह सब कैसे काम करता है ताकि मैं दूसरों की मदद कर सकूं। यदि यहां प्रधान मंत्री के रूप में ऐसी कोई चीज है तो मैं इसे आपको ईमेल करूंगा यदि आप एक नज़र डालने के इच्छुक हैं। एक बार जब मैं इसे काम कर लेता हूं, तो मैं यहां कोड पोस्ट करूंगा। मुझे विश्वास करना है कि अन्य लोग भी वही चीज़ ढूंढ रहे हैं जैसा मैं हूं। हालांकि, सबसे महत्वपूर्ण बात यह है कि, मैं सिर्फ उच्च स्तर से जानना चाहता हूं, मेरी समस्या का समाधान करने का सही तरीका क्या है? यदि आप मेरे लिंक को देखते हैं तो आप देख सकते हैं कि मैं क्या कोशिश कर रहा हूं (जो तालिका को पॉप्युलेट करने वाली विधि के पूर्णांक को पास करना था), लेकिन जैसा कि मैंने कहा, मैंने मूल रूप से उस पर छोड़ दिया क्योंकि मुझे कहीं भी नहीं मिल रहा था। लोग मेरी मदद करने की कोशिश कर रहे हैं, लेकिन मैं मूर्ख हूँ।

मेरे agonizingly लंबे संदेश के साथ असर के लिए धन्यवाद। यदि आपने इसे अभी तक बनाया है और मेरे लिए कुछ सुझाव हैं तो मैं सभी कान हूं। मैं ईमानदार रहूंगा, यद्यपि - अगर आप मुझे बताते हैं तो मुझे सिर्फ पूरी चीज को स्क्रैप करना चाहिए और कोर डेटा का उपयोग करना चाहिए। मुझे सच में नहीं लगता कि मेरे पास डेटा प्रबंधन के एक अलग तरीके को समझने का समय है। जैसा कि मैंने कहा, मैं डेटाबेस और मेरे ऐप के क्वेरी पार्ट्स से बहुत खुश हूं - यह सिर्फ उन्माद के विचारों का प्रबंधन कर रहा है और उन लोगों के बीच डेटा पास कर रहा है जो मुझे मार रहे हैं!

किसी भी मदद की सराहना की जाती है - आपको बहुत बहुत धन्यवाद।

+2

डाउनवोट क्यों? सवाल पूरी तरह से कानूनी है और न सिर्फ एक और होमवर्क सवाल है। – JustSid

+0

@truthsmiles - मुझे आपको यह बताने में खुशी होगी, मुझे Google चैट पर पिंग करने के लिए स्वतंत्र महसूस करें। (moshberm) इस बीच, मैं एक जवाब लिखने की कोशिश करने जा रहा हूँ। – Moshe

+2

@ मोशे, -1 अगर मैं कर सकता हूं, तो किसी को व्यक्तिगत रूप से चर्चा करने के लिए कह रहा हूं, पूरे एसओ मॉडल के खिलाफ चला जाता है क्योंकि यह किसी और की मदद नहीं करेगा। – Pops

उत्तर

4

यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप एक व्यू कंट्रोलर को प्रारंभ करने और अपने व्यवहार को बदलने के लिए कुछ डेटा में पास करने के तरीके से पूछ रहे हैं। समझने के लिए यहां मुख्य अवधारणा यह है कि उद्देश्य-सी में वस्तुओं को कैसे प्रारंभ किया जाता है। सबसे आम सवाल है, कि डेवलपर्स, जो iOS के लिए नए हैं से एक है:

HowcanIpassdatabetweenmyviews?

हां, वहां आठ अलग-अलग लिंक हैं। (ठीक है, वह आठवां लिंक विषय से थोड़ी दूर है, लेकिन यह काफी करीब है।) ऐसा करने के कई तरीके हैं और मैं संक्षेप में उनके माध्यम से जाऊंगा। मैं कस्टम प्रारंभकर्ताओं का भी वर्णन करूंगा, जो एक प्रासंगिक बिंदु भी हैं।

आइए दिखाएं कि हम एक कैटलॉग एप्लिकेशन बना रहे हैं जो विभिन्न श्रेणियों में उत्पादों का एक समूह दिखाता है। कल्पना करें कि हमारा ऐप ऐप्पल स्टोर ऐप की तरह उत्पादों की एक सूची में खुलता है। कहें कि जब उपयोगकर्ता किसी उत्पाद पर टैप करता है तो हम एक उत्पाद पृष्ठ दिखाना चाहते हैं।

  1. आप "अगले" दृश्य नियंत्रक पर गुण सेट कर सकते हैं। - बस, हम UIViewController सबक्लास बना सकते हैं और productID संपत्ति (जिसे हमने बनाया है) सेट कर सकते हैं। आइए हमारे नए UIViewController को ProductPageViewController पर कॉल करें। यहां बताया गया है कि यह कैसे दिखाई देगा:

    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
    
        //Create a ProductPageViewController 
        ProductPageViewController *ppvc = [[ProductPageViewController alloc] initWithNibName:@"ProductPageViewController" bundle:nil]; 
        //set the property on our ProductPageViewController 
        [ppvc setProductID:42]; 
        //We would usually present the PPVC here. 
        //After presenting, remember to release the view controller 
    } 
    

    पहली पंक्ति में, हम उत्पाद दृश्य नियंत्रक बनाते हैं। हम alloc पर कॉल करते हैं, फिर init। (फ़ंक्शंस लपेटे गए हैं - यानी, हम init को सीधे alloc विधि के परिणाम पर कॉल करते हैं।)

    फिर, हमने अपने विचार की एक संपत्ति निर्धारित की है।दृश्य अब viewWillAppear में कॉन्फ़िगर किया जा सकता है और सब ठीक है।

  2. आप लगातार स्टोर के माध्यम से डेटा साझा कर सकते हैं। - यह विधि थोड़ा अलग तरीके से काम करती है। दृश्य नियंत्रक एक दूसरे को पेश करने वाले पहले व्यक्ति को छोड़कर बिल्कुल संवाद नहीं करते हैं। जब भी पहले दृश्य में कोई मान बदलता है (जिसे आप जारी रखना चाहते हैं), तो आप इसे कोर डेटा या NSUserDefaults पर लिखते हैं। फिर, नया दृश्य मान को पढ़ता है क्योंकि इसकी आवश्यकता होती है।

    अपना पहला दृश्य नियंत्रक में:

    //A method to store the data 
    - (void)storeData:(id)pageID{ 
        [[NSUserDefaults setObject:pageID forKey:@"pageID"]; 
    } 
    
    - (void)showNewPPVC{ 
    
        ProductPageViewController *ppvc = [[ProductPageViewController alloc] initWithNibName:@"ProductPageViewController" bundle:nil];   
        //Show and then release the PPVC 
    } 
    
  3. आप कस्टम initializers उपयोग कर सकते हैं। - अवधारणा को समझने के बाद, यह संभवतः यह करने का सबसे सहज तरीका है, क्योंकि यह केवल एकमात्र ऐसा है जहां डेटा वास्तव में "पास" होता है। (विधि 2 के विपरीत जहां कोई डेटा सीधे साझा नहीं किया जाता है और विधि 1 जहां डेटा को संपत्ति के रूप में पास किया जाता है।)

    ध्यान दें कि पिछले उदाहरणों में, मैंने initWithNibName:Bundle विधि का उपयोग किया था। आप यह भी ध्यान दे सकते हैं कि UITableViewController एस एक अलग प्रारंभकर्ता का उपयोग करता है, initWithStyle:। वे दो प्रारंभकर्ता नई वस्तु के लिए कुछ जानकारी लेते हैं ताकि यह जान सके कि लोड कैसे करें। आइए पहले पहले देखें:

    - (id)initWithNibName:(NSString *)nibNameOrNil Bundle:(NSBundle *)bundleNameOrNil; 
    

    पहला तर्क दृश्य नियंत्रक को बताता है जो nib फ़ाइल को लोड करने के लिए कहता है। मैं अब के लिए दूसरे तर्क को अनदेखा करने जा रहा हूं, क्योंकि मैंने कभी भी nil को छोड़कर कुछ भी पारित नहीं देखा है। सही दूसरे उदाहरण के लिए के साथ आगे बढ़:

    - (id)initWithStyle:(UITableViewStyle)style; 
    

    आप यहाँ दो UITableViewStyle मान पारित कर सकते हैं। तालिका तालिका की शैली को परिभाषित करने का यह एक तरीका है (दूसरी तरफ सीधे एक निब फ़ाइल को संशोधित करना)।

    चलो इस अवधारणा को हमारे उदाहरण में थोड़ा सा बढ़ाएं। अब मैं आपको अपना खुद का कस्टम प्रारंभकर्ता बनाने का तरीका दिखा रहा हूं। आइए हमारे ProductPageViewController इंस्टेंस को प्रारंभ करें:

    - (id) initWithProductID:(int)productID; 
    

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

    - (id) initWithProductID:(int)productID{ 
    self = [super init]; 
    
    return self; 
    } 
    

    यह विधि एक निब से हमारे हमारे यूआई ProductPageViewController, तथापि, यह अप लोड नहीं होगा की एक प्रारंभ प्रतिलिपि वापस आ जाएगी अभी तक, या अगर यह एक UITableViewController थे, यह UITableViewStyle सेट नहीं होता। आइए पहले एनआईबी के साथ काम करें और फिर मैं दिखाऊंगा कि UITableViewController कैसे काम करें। तो ...

    - (id) initWithProductID:(int)productID{ 
    self = [super initWithNibName:@"ProductPageViewController" Bundle:nil]; 
    
    return self; 
    } 
    

    अब। हमारे पास एनआईबी से लोड ProductPageViewController प्रारंभ हुआ है, लेकिन यह अभी तक कुछ भी नहीं करता है। ध्यान दें कि हम NibName और Bundle तर्कों का खुलासा नहीं करते हैं, लेकिन हम उन्हें अपने आप में पास करते हैं। यदि आप चाहते हैं, तो आप सैद्धांतिक रूप से उनको भी उजागर कर सकते हैं। अब, हम productID ले लें और इसके साथ कुछ करें।

    - (id) initWithProductID:(int)productID{ 
    self = [super initWithNibName:@"ProductPageViewController" Bundle:nil]; 
    
        if(self){ 
        self.prodID = productID; 
        } 
    
    return self; 
    } 
    

    हमारे नवीनतम परिवर्तनों के साथ, हमारे "PPVC" अब productID के बारे में जानता है। यह डेटाबेस के रूप में आप पूछ सकते हैं और परिणाम के साथ चीजें कर सकते हैं। फिर आप productID के आधार पर अलग-अलग प्रश्नों को चला सकते हैं।

दो अधिक त्वरित सुझाव:

  1. शायद आप कई तर्क में पारित करने के लिए चाहते हैं। बेशक आप उन्हें आसानी से विधि हस्ताक्षर - (id) initWithProductID:(int)productID andCategoryID(int)categoryID में जोड़ सकते हैं, लेकिन यदि आपके पास पांच, छह, या पचास छः हैं (हाँ, यह बहुत कुछ है) तर्क क्या होता है? मैं एक संग्रह या तर्क की सरणी में गुजरने की सलाह दूंगा।

  2. UITableView के साथ कस्टम प्रारंभकर्ताओं का उपयोग करने के लिए, आप एनआईबी नाम के बजाय UITableViewStyle में पास करते हैं। यहाँ यह कैसा दिखाई दे सकता है:

     - (id) initWithProductID:(int)productID{ 
         self = [super initWithStyle:UITableViewStyleGrouped]; 
    
         if(self){ 
          self.prodID = productID; 
         } 
    
         return self; 
         } 
    

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