2013-04-09 4 views
6

में पहले उत्तरदाता को UITextField बनाने के लिए मेरे पास UITabeView है जिसमें प्रत्येक सेल के अंदर UITextField है। हालांकि मुझे पिछले/अगले UITableViewCell के अंदर टेक्स्ट फ़ील्ड बनाने के लिए पिछले/अगले बटन को लागू करने में परेशानी हो रही है।UITableView में पिछला उत्तर/अगला बटन लागू करने के लिए मेरे उत्तर में एक गैर-दृश्यमान सेल

मैं UITableViewCell वर्ग subclassed किया है यह एक निश्चित विधि कॉल की यह delegate है जब prev./next बटन दबाया जाता है और इस विधि का एक पैरामीटर के रूप सेल में ही पारित करने के लिए (इसलिए मैं अपने सूचकांक पथ प्राप्त कर सकते हैं गणना करने के लिए जो जिसका पाठ क्षेत्र पहले प्रत्युत्तर किए जाने के लिए है सेल के सूचकांक पथ)

प्रतिनिधि की विधि के कार्यान्वयन में है मैं:

  • जिसका बटन दबाया गया था सेल के सूचकांक पथ प्राप्त
  • इंडेक्स से 1 जोड़ें या घटाएं उस कक्ष की वें (पर निर्भर करते हुए बटन दबाया गया था)
  • सेल जिसका पाठ फ़ील्ड है तालिका दृश्य
  • पाठ क्षेत्र पहले प्रतिसादी

समस्या बनाने पर -cellForRowAtIndexPath: विधि का उपयोग कर पहले प्रतिसादी किए जाने के लिए मिलता है यह है कि -cellForRowAtIndexPath: विधि केवल तभी सेल लौटाती है जब यह दिखाई दे। तो जब सेल दिखाई नहीं दे रहा है तो यह nil लौटाएगा और उपरोक्त एल्गोरिदम काम नहीं करेगा, जबकि सेल स्क्रीन पर है, यह सही तरीके से काम करेगा।

यहां पर मेरा कोड है। बटन, कि MUInfoMateriaTableViewCell प्रदान की UITableViewCell की मेरी उपवर्ग है और यह एक textField संपत्ति है कि इसके पाठ क्षेत्र देता है:

- (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell 
{ 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]; 

    MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath]; 
    [newCell.textField becomeFirstResponder]; 
} 

वहाँ किसी भी तरह से करने के लिए तो मैं अपने पाठ कर सकते हैं एक सेल है कि दिखाई नहीं देता है "मिल" है पहले उत्तरदाता क्षेत्र? या क्या आप इस समस्या के आसपास काम करने के लिए मुझे एक और एल्गोरिदम सुझा सकते हैं?

उत्तर

7

आप बहु-चरण की प्रक्रिया के साथ इसे ठीक कर सकते हैं: सेल है कि पहले प्रत्युत्तर बनाने के लिए

  • गणना इच्छित पाठ फ़ील्ड की

    • रखें ट्रैक सेल को NSIndexPath दिखाया जा सकता है और [self.tableView scrollToRowAtIndexPath:atScrollPosition:animated:] को
    • tableView:willDisplayCell:forRowAtIndexPath: कोपर कॉल करने के लिए लागू करने के लिए कॉल करें वांछित सेल परजब यह दिखाई देने लगता है और यह वांछित सेल या सूचकांक पथ

    अंतिम चरण महत्वपूर्ण है क्योंकि बुला becomeFirstResponder कुछ नहीं करता है, तो रिसीवर किसी भी खिड़की के एक subview नहीं है मेल खाता है।

  • +0

    सेल का ट्रैक रखने के लिए आप कैसे सुझाव देते हैं जिसका टेक्स्ट फ़ील्ड पहला उत्तरदाता बनना चाहिए? क्या मेरे पास ivar नामक कुछ है जिसे 'activeCellIndexPath' नाम दिया गया है और जांचें कि सक्रिय सेल का इंडेक्स पथ सेल के इंडेक्स पथ से मेल खाता है, 'tableView: willDisplayCell: forRowAtIndexPath:' या क्या कोई बेहतर/अधिक कुशल है दृष्टिकोण? – BigLex

    +0

    मैं ठीक से लागू करता हूं कि आपने इसे अभी कैसे वर्णित किया है। उस मामले को संभालना सुनिश्चित करें जहां आप उत्तरदाता को कोई भी सेल नहीं बनाना चाहते हैं और 'nil' 'activeCellIndexPath' को बाहर नहीं करना चाहते हैं। – jszumski

    +0

    ठीक है! धन्यवाद महोदय! – BigLex

    3

    scrollToRowAtIndexPath:atScrollPosition:animated: का उपयोग करके तालिका दृश्य को स्क्रॉल करके सेल दृश्यता बनाएं।

    उदाहरण के लिए

    - (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell 
    { 
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
        NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]; 
    
        [self.tableView scrollToRowAtIndexPath:previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    
        MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath]; 
        [newCell.textField becomeFirstResponder]; 
    } 
    
    -1

    समस्या यह है कि -सेलफॉररोएट इंडेक्सपैथ: विधि सेल केवल तभी दिखाई देती है जब यह दिखाई दे।

    ऐसा इसलिए है क्योंकि सेल मौजूद नहीं है जब इसकी पंक्ति दिखाई नहीं दे रही है। UITableView केवल उन कक्षों को रखता है जिन्हें इसे तालिका खींचने की आवश्यकता होती है। यही कारण है कि जब आप तालिका को स्क्रॉल करते हैं तो आपको बहुत सारे -tableView:cellForRowAtIndexPath: संदेश मिलते हैं - तालिका अपने डेटा स्रोत को उन कक्षों को प्रदान करने के लिए कह रही है, जिनके पास यह नहीं है।

    यदि आप अपने वर्तमान दृष्टिकोण का उपयोग करना चाहते हैं, तो आपको तालिका को स्क्रॉल करने की आवश्यकता होगी ताकि संपादित होने वाली पंक्ति दिखाई दे, जैसा गैब्रिएल पेट्रोनेला के जवाब में दिखाया गया है।

    +0

    यह सिर्फ गलत है। 'TableView: cellForRowAtIndexPath: 'के एक सामान्य कार्यान्वयन को देखें और आप देखेंगे कि क्या होता है। यह हमेशा एक सेल लौटाता है, लेकिन अगर यह वर्तमान में दिखाई नहीं दे रहा है तो उसे उस सूचकांक पथ के लिए एक नया सेल बनाना पड़ सकता है। या यह अभी भी अपने सेल कैश में हो सकता है, इस मामले में यह पहले से मौजूद सेल को हटा देगा और वापस कर देगा। – Logachu

    +0

    @Logachu मेरी प्रतिक्रिया मूल प्रश्न के संदर्भ में सही है, लेकिन गलत संपादन '-cellForRowAtIndexPath: '(एक UITableView विधि) को' -tableView: cellForRowAtIndexPath:' (एक UITableViewDataSource विधि) में बदल दिया गया है, जो प्रश्न को बदलता है। यह लगभग उसी समय हुआ होगा जब मैं जवाब दे रहा था, क्योंकि मैंने गलत जवाब को मेरे उत्तर में उद्धरण में कॉपी किया था। मैंने उद्धरण और प्रश्न तय कर लिया है, और यदि आपने अपना जवाब UITableView के साथ दिमाग में पढ़ा है (और शायद [दस्तावेज़] (http://bit.ly/KF1He4) की जांच करें) मुझे आशा है कि आप सहमत होंगे कि यह सही है। – Caleb

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