मेरे पास एक खंडित तालिका दृश्य है जो सभी अनुभागों के सभी कक्षों में सभी डेटा लोड करता है। प्रत्येक सेल में एक टेक्स्टफिल्ड होता है।

टेबलव्यू पूरी तरह से आईपैड स्क्रीन में फिट नहीं होता है, और मैं डेटा को पढ़ने/सहेजने के लिए सभी अदृश्य कोशिकाओं तक नहीं पहुंच सकता। और जब मैं "textField" में परिवर्तन करता हूं, तो ऊपर स्क्रॉल करें, नीचे स्क्रॉल करें, सभी परिवर्तन समाप्त हो गए हैं।

मुझे उन तक पहुंचने में सक्षम होने के लिए, सभी कक्षों को लोड करने की आवश्यकता है, यहां तक ​​​​कि एक बार अदृश्य भी।

मुझे खेद है, मैंने अभी कुछ दिन पहले टेबल के साथ काम करना शुरू किया है... मुझे लगता है कि इस समस्या का पुन: प्रयोज्य कोशिकाओं से कुछ लेना-देना है, लेकिन यह सुनिश्चित नहीं है कि इसे कैसे हल किया जाए।

आपकी मदद के लिए देख रहे हैं, कृपया।

आरंभीकरण:

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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 400, 30)] ;
        textField.enabled = NO;
        cell.accessoryView = textField;
        [textField release];

}
    UITextField *textField = (UITextField*)cell.accessoryView;

    if(indexPath.section == 0)
        cell.textLabel.text = [idenInfo objectAtIndex:indexPath.row];
    else if (indexPath.section == 1)
        cell.textLabel.text = [prodInfo objectAtIndex:indexPath.row];
    else if (indexPath.section == 2)
        cell.textLabel.text = [visInfo objectAtIndex:indexPath.row];


    if(indexPath.section == 0)
        textField.text = [idenInfoRez objectAtIndex:indexPath.row];
    else if (indexPath.section == 1)
        textField.text = [prodInfoRez objectAtIndex:indexPath.row];
    else if (indexPath.section == 2)
        textField.text = [visInfoRez objectAtIndex:indexPath.row];

    textField = nil;

    return cell;
}
1
Razp 13 अप्रैल 2011, 15:09

5 जवाब

सबसे बढ़िया उत्तर

सबसे पहले: आपको अदृश्य सहित सभी कोशिकाओं को लोड करने की आवश्यकता नहीं है। यह UITableView और MVC पैटर्न का संपूर्ण बिंदु है: अपने विचारों को अपने डेटा से अलग करें।

आप जो करना चाहते हैं वह आपके डेटा स्रोत को अपडेट करना है (यानी idenInfoRez, prodInfoRez और vizInfoRez आपके मामले में) जब उपयोगकर्ता ने टेक्स्टफिल्ड के अंदर एक मान बदल दिया है। तो आपको अपने UIViewController को प्रत्येक टेक्स्टफील्ड के प्रतिनिधि के रूप में सेट करना होगा और मानों को उपयोगकर्ता के प्रकार के रूप में अपडेट करना होगा।

3
scalbatty 13 अप्रैल 2011, 15:37

[UIView startAnimations:@"ShiftUp" प्रसंग: शून्य]; [UIView सेटएनीमेशन अवधि: 0.0001]; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = [indexPath section];

static NSString *CellIdentifier = @"Cell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

अगर (सेल == शून्य) {

    [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = objCustCell;
   cell.selectionStyle = UITableViewCellSelectionStyleNone ;

}

if (section == 0) {

       switch (indexPath.row) {
           case 0:{

            cell.lable.text = @"Date of Birth";
            cell.field.placeholder = @"Birth Name";

               break;
           }

           case 1:{

               cell.lable.text = @"Enter Your Name";
               cell.field.placeholder = @"Full Name";

               break;
           }


           default:
               break;
       }

 }

[UIView beginAnimations:@"ShiftUp" context:nil];
[UIView setAnimationDuration:0.0001];

//  [UIView beginAnimations: @"ShiftUp" context:nil];

NSLog(@"Load cellfor raw at index  ");
// Configure the cell.
       return cell;

}

नोट: UIView एनीमेशन टेक्स्ट फ़ील्ड को डेटा दूर जाने की अनुमति नहीं देगा या कोई भी UIcontroller अपनी पुरानी स्थिति में ही रहेगा !! एनीमेशन कमिट न करें अन्यथा यह काम नहीं करेगा !!

1
Faizan Refai 2 मार्च 2012, 17:22

आप यह क्या कर सकते हैं: प्रत्येक TextField के एडिटिंग चेंजेड ईवेंट में टेक्स्ट फ़ील्ड में मान को एक NSMutableArray में स्टोर किया जाता है, जिसकी संख्या सेल की संख्या के बराबर होती है। अर्थात।

-(IBAction) EditingChanged: (id) sender

{

   UITextField *txt =(UITextField*)sender;

   NSString* str =[[NSString alloc] initWithString: txt.text]; 
   //get current text string

   NSInteger path =[tableView indexPathForSelectedRow].row;
          // get currently selected row, this could be a bit different depending on the number of sections

   [yourMutableArray insertObject: str atIndex: path]; 

   [str release]

}

फिर आप TextField को NSMutableArray के मानों से भर सकते हैं, जब भी कक्षों को फिर से बनाया जाता है, अर्थात।

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

{

   ...... // create the cells here and use viewTag to get the textFields

   textField.text= [yourMutableArray objectAtIndex:indexPath.row];

   //This may be a bit different depending on the number of sections.

}

साथ ही, ध्यान दें कि yourMutable सरणी को कक्षों की संख्या की क्षमता के अनुसार प्रारंभ करना उचित हो सकता है।

मुझे खेद है अगर कोड अच्छी तरह से स्वरूपित नहीं हैं क्योंकि यह स्टैक ओवरफ्लो पर मेरी पहली पोस्ट है - कोड में कुछ टाइपो भी हो सकते हैं। आशा है कि यह किसी की मदद करता है।

0
antyrat 29 सितंबर 2011, 16:51

हर बार जब हम अलग-अलग डेटा के लिए सेल आवंटित करते हैं, तो डेटा सेल को फिर से लोड नहीं करेगा, हर बार डेटा पिछले डेटा को ओवरराइड करता है, सेल को खाली करने के लिए सेल आवंटित करने से पहले, जैसे सेल = शून्य

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

            static NSString *CellIdentifier = @"Cell";
            UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

           cell=nil;
        //it clear data in the cell
            if (cell == nil)
 {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
                UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 400, 30)] ;
                textField.enabled = NO;
                cell.accessoryView = textField;
                [textField release];

        }
0
NANNAV 3 सितंबर 2012, 16:30

आप सही कह रहे हैं, समस्या यह है कि कोशिकाओं का पुन: उपयोग किया जाएगा। समस्या के दो समाधान हैं, त्वरित और गंदा एक पुन: प्रयोज्य कोशिकाओं का उपयोग नहीं करना होगा:

हटाए इसे:

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil) {

और बस इसे छोड़ दो:

   UITableViewCell * cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 400, 30)] ;
    textField.enabled = NO;
    cell.accessoryView = textField;
    [textField release];

यह ठीक होना चाहिए, यदि आपके टेबलव्यू में केवल कुछ ही सेल हैं (लगभग 50 से कम)।


बेहतर समाधान यह होगा कि सेल का पुन: उपयोग छोड़ दिया जाए, और उनके टेक्स्टफील्ड को अनुरोध के अनुसार भर दिया जाए। दृष्टिकोण ऐप से ऐप में भिन्न होता है, लेकिन आपको मूल रूप से कभी भी सीधे सेल तक नहीं पहुंचना चाहिए, और सेल के डेटा को कहीं और स्टोर करना चाहिए, उदा। एनएसएसटींग्स ​​का एक एनएसएआरएआरई। फिर आप एनएसएआरएआरई में हेरफेर कर सकते हैं। आपकी cellForRowAtIndexPath विधि कुछ इस तरह दिखाई देगी:

textField.text = [arrData objectAtIndex:indexPath.row];
-1
Jan Gressmann 13 अप्रैल 2011, 15:41