2011-09-08 24 views
6

मुझे में कस्टम सेल के लिए NSIndexPath प्राप्त करने की आवश्यकता है। यहां समस्या है: मैं अपने कस्टम सेल से NSNotification को अपने UITableViewController पर editingDidBegin को अपने कस्टम सेल में UITextField से कॉल करता हूं। UITableViewController में, UITextField संपादन शुरू करने पर मैं UITableView का आकार बदलता हूं, और उसके बाद टेबल दृश्य को उस सेल पर स्क्रॉल करना चाहता है जिसमें UITextField पहला प्रतिसादकर्ता है। लेकिन मैं यह नहीं समझ सकता कि सेल के indexPath को वापस कैसे करें, जहां UITextField संपादित किया जा रहा है। मैंने कई तरीकों से कोशिश की है, लेकिन यह अभी भी काम नहीं कर रहा है। एक तरीका यह है: मेरे cstomCell कक्षा में मैं पंक्ति [self setSelected:YES] और अपने टीवी नियंत्रक तो इन का उपयोग कर चयन अगर मैं [self.tableV indexPathForSelectedRow] की पंक्ति NSLog यह हमेशा रिटर्न 0 यहां तक ​​कि अपने हमेशा हालांकि नहीं 0.कस्टम सेल से NSIndexPath वापसी? (UITableView)

+0

क्या आप उसे 'फ्रेम' नहीं ले पाएंगे? – aopsfan

उत्तर

14

बस सेल के लिए एक मूल्य देना इसकी tag संपत्ति। तो फिर तुम जब से तुम अपने कस्टम सेल में एक UITextField है आप में cell.textField.delegate = self; जगह कर सकते हैं एक बार आप सेल आप इस

NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell]; 

तरह NSIndexPath प्राप्त कर सकते हैं इस

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue]; 

तो फोन करके कि सेल प्राप्त कर सकते हैं

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

डेटा स्रोत विधि। इस तरह आपको कस्टम सेल में एनएसएनोटिफिकेशन सेट अप नहीं करना पड़ेगा। इसके अलावा इस एक ही विधि में आप दोनों अपनी कोशिकाओं इस cell.textField.tag = indexPath.row; की तरह पाठ क्षेत्र और इस cell.tag = indexPath.row;

तरह सेल अब आप UITextField प्रतिनिधि निर्धारित किया है कि टैग कर सकते हैं, अब आप अपने UITableViewController कक्षा में इस विधि जगह कर सकते हैं

- (void)textFieldDidBeginEditing:(UITextField *)textField { 

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag]; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];   

} 

उपर्युक्त UITextField प्रतिनिधि विधि आपको उस सेल के लिए इंडेक्सपैथ प्राप्त करनी चाहिए जिसे आपने वर्तमान में चुना है।

+0

मुझे यह नहीं मिला, कृपया कुछ और कोड प्रदान करें। कोड की दो पंक्तियों के बीच कोई संबंध नहीं है, कृपया मुझे बताएं कि कोड की कौन सी पंक्ति डालना है। – JonasG

+0

@ मैक्सनर मैंने अपना जवाब संपादित किया है। उम्मीद है कि किसी भी भ्रम को साफ करता है। – ms83

-1

मैं इतनी तरह मेरे कोशिकाओं टैग करना चाहता:

/* Create a tag based on the section and row of a cell(used to retrive the cell for the beginEditingNextCell method. */ 
-(NSInteger)tagForIndexPath:(NSIndexPath*)path { 
    return path.section * 1000 + path.row + 1; 
} 

दूसरी तरह के एक कस्टम प्रतिनिधि का उपयोग कर beginEditing डेटा पास करने के लिए है, और एक सेल मॉडल है, जो आप तो अपने पथ यह पता लगाने के लिए उपयोग कर सकते हैं शामिल इस पर निर्भर करता है कि आप डेटा कैसे संग्रहीत कर रहे हैं।

मेरी GitHub परियोजना बाहर की जाँच करें, यह कीबोर्ड के लिए आकार बदलने और अगले संपादन योग्य सेल पर टैब के रूप में इस मामले को संभालने के लिए, साथ ही कोड है: https://github.com/andrewzimmer906/XCell

+0

आपकी जिथब प्रोजेक्ट एक पूर्ण गड़बड़ है, कम से कम 20 त्रुटियां और निर्माण पर चेतावनियां। क्या आप कृपया मेरे प्रश्न से संबंधित कुछ और कोड प्रदान कर सकते हैं? मेरे पास 50 का खुली बक्षीस है। – JonasG

0

इस कोड की कोशिश ..

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    UITableView *tableView; 
    UITableViewCell* superViewCell = [self returnSuperCellViewOfTextField:textField]; 
    if(superViewCell)[tableView scrollToRowAtIndexPath:[tableView indexPathForCell:superViewCell] atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 

-(id)returnSuperCellViewOfTextField:(id)viewToCheck 
{ 
    id superView = [viewToCheck superview]; 
    if([viewToCheck isKindOfClass:[UITableViewCell class]] && superView)return superView; 
    else if(([viewToCheck respondsToSelector:@selector(superview)] && superView)) return [self returnSuperCellViewOfTextField:superView]; 
    return nil; 
} 
0

इस (आपके जवाब यह है कि आप नीचे दिए गए पूर्व में दी गई) अभी भी काम करता है अगर आप प्रत्येक कोशिका ?:

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue]; 
then once you have the cell you can get the NSIndexPath like this 

NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell]; 

में कई texfields है चूंकि आप एकहै क्या अपने कस्टम सेल मेंआप

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

डेटा स्रोत विधि में cell.textField.delegate = self; रख सकते हैं। साथ ही इस विधि में आप अपने सेल टेक्स्ट टेक्स्ट दोनों को इस सेल.textField.tag = indexPath जैसे टैग कर सकते हैं।पंक्ति; और सेल इस सेल.tag = indexPath.row की तरह;

अब आप UITextField प्रतिनिधि निर्धारित किया है कि, अब आप अपने UITableViewController कक्षा में इस विधि जगह कर सकते हैं

- (void)textFieldDidBeginEditing:(UITextField *)textField { 

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag]; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

मैं 8 कोशिकाओं के साथ एक tableview है, और प्रत्येक कोशिका में मैं 6 texfields है, और भी टेबलव्यू गतिशील है, इसलिए उपयोगकर्ता अधिक सेल्स को सम्मिलित कर सकता है ... लेकिन मुझे प्रत्येक टेक्सफील्ड में उपयोगकर्ता द्वारा दर्ज किए गए पाठ को सहेजने में परेशानी हो रही है। क्या यह संभव है कि "cell.textField.tag = indexPath.row" के साथ, नियंत्रक पहचानने वाले टेक्साफ़ील्ड में है?

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