简体   繁体   English

使用UITableViewCell和UITextField滚动问题

[英]Scrolling Issue with UITableViewCell and UITextField

I've got a little problem with my UITableViewCells. 我的UITableViewCells有点问题。 I've got 5 sections with different amount of rows in my tableView. 我的tableView中有5个不同行数的部分。 I added each row a subview including a UITextfield. 我在每行添加了一个包含UITextfield的子视图。 the problem i am having is, that when i scroll, my subviews of the cell are changing around. 我遇到的问题是,当我滚动时,我的细胞的子视图正在改变。 I took a video, so you can see what i mean. 我拍了一段视频,你可以看到我的意思。

http://files.beger.org/Scolling_Issue18072012.swf http://files.beger.org/Scolling_Issue18072012.swf

Sorry that it is all in german :) 对不起,全是德国人:)

here is the code: 这是代码:

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

// Add a UITextFiel
    if ([indexPath section] == 0) {
        UITextField *textFieldName = [[UITextField alloc] initWithFrame:CGRectMake(120, 10, 185, 30)];
        textFieldName.adjustsFontSizeToFitWidth = YES;
        textFieldName.textColor = [UIColor blackColor];
        if ([indexPath row] == 0) {
            textFieldName.placeholder = @"Max";
            textFieldName.keyboardType = UIKeyboardTypeDefault;
            textFieldName.returnKeyType = UIReturnKeyDone;
        }
        else {
            textFieldName.placeholder = @"Mustermann";
            textFieldName.keyboardType = UIKeyboardTypeDefault;
            textFieldName.returnKeyType = UIReturnKeyDone;
        }       
        textFieldName.backgroundColor = [UIColor clearColor];
        textFieldName.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        textFieldName.autocapitalizationType = UITextAutocapitalizationTypeWords; // no auto capitalization support
        textFieldName.textAlignment = UITextAlignmentLeft;
        textFieldName.tag = 0;
        //playerTextField.delegate = self;

        textFieldName.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [textFieldName setEnabled: YES];

        [cell addSubview:textFieldName];

        [textFieldName release];
    }
    else if ([indexPath section] == 1) {
        UITextField *textFieldContactData = [[UITextField alloc] initWithFrame:CGRectMake(120, 10, 185, 30)];
        textFieldContactData.adjustsFontSizeToFitWidth = YES;
        textFieldContactData.textColor = [UIColor blackColor];
        if ([indexPath row] == 0) {
            textFieldContactData.placeholder = @"04132 21123 321";
            textFieldContactData.keyboardType = UIKeyboardTypePhonePad;
        }
        else if ([indexPath row] == 1) {
            textFieldContactData.placeholder = @"04132 21123 300";
            textFieldContactData.keyboardType = UIKeyboardTypePhonePad;
        }
        else if ([indexPath row] == 2) {
            textFieldContactData.placeholder = @"0150 12543 101";
            textFieldContactData.keyboardType = UIKeyboardTypePhonePad;
        }
        else if ([indexPath row] == 3) {
            textFieldContactData.placeholder = @"beispiel@musterfirma.de";
            textFieldContactData.keyboardType = UIKeyboardTypeEmailAddress;
            textFieldContactData.returnKeyType = UIReturnKeyDone;
        }
        else if ([indexPath row] == 4) {
            textFieldContactData.placeholder = @"www.musterfirma.de";
            textFieldContactData.keyboardType = UIKeyboardTypeURL;
            textFieldContactData.returnKeyType = UIReturnKeyDone;
        }
        else {
            textFieldContactData.placeholder = @"Deutsch";
            textFieldContactData.keyboardType = UIKeyboardTypeDefault;
            textFieldContactData.returnKeyType = UIReturnKeyDone;
        }
        textFieldContactData.backgroundColor = [UIColor clearColor];
        textFieldContactData.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        textFieldContactData.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
        textFieldContactData.textAlignment = UITextAlignmentLeft;
        textFieldContactData.tag = 0;
        //playerTextField.delegate = self;

        textFieldContactData.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [textFieldContactData setEnabled: YES];

        [cell addSubview:textFieldContactData];

        [textFieldContactData release];
    }
    // Adresse
    else if ([indexPath section] == 2) {
        UITextField *textFieldAddress = [[UITextField alloc] initWithFrame:CGRectMake(120, 10, 185, 30)];
        textFieldAddress.adjustsFontSizeToFitWidth = YES;
        textFieldAddress.textColor = [UIColor blackColor];
        if ([indexPath row] == 0) {
            textFieldAddress.placeholder = @"Musterstr. 10";
            textFieldAddress.keyboardType = UIKeyboardTypeDefault;
            textFieldAddress.autocapitalizationType = UITextAutocapitalizationTypeWords;
        }
        else if ([indexPath row] == 1) {
            textFieldAddress.placeholder = @"50000";
            textFieldAddress.keyboardType = UIKeyboardTypeDefault;
        }
        else if ([indexPath row] == 2) {
            textFieldAddress.placeholder = @"Musterstadt";
            textFieldAddress.keyboardType = UIKeyboardTypeDefault;
            textFieldAddress.autocapitalizationType = UITextAutocapitalizationTypeWords;
        }
        else {
            textFieldAddress.placeholder = @"Deutschland";
            textFieldAddress.keyboardType = UIKeyboardTypeDefault;
            textFieldAddress.autocapitalizationType = UITextAutocapitalizationTypeWords;
        }
        textFieldAddress.backgroundColor = [UIColor clearColor];
        textFieldAddress.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        textFieldAddress.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
        textFieldAddress.textAlignment = UITextAlignmentLeft;
        textFieldAddress.tag = 0;
        //playerTextField.delegate = self;

        textFieldAddress.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [textFieldAddress setEnabled: YES];

        [cell addSubview:textFieldAddress];

        [textFieldAddress release];
    }
    // Abteilung und Funktion
    else if ([indexPath section] == 3) {
        UITextField *textFieldFunction = [[UITextField alloc] initWithFrame:CGRectMake(120, 10, 185, 30)];
        textFieldFunction.adjustsFontSizeToFitWidth = YES;
        textFieldFunction.textColor = [UIColor blackColor];
        if ([indexPath row] == 0) {
            textFieldFunction.placeholder = @"Einkauf";
            textFieldFunction.keyboardType = UIKeyboardTypeDefault;
            textFieldFunction.autocapitalizationType = UITextAutocapitalizationTypeWords;
        }
        else {
            textFieldFunction.placeholder = @"Einkaufsleiter";
            textFieldFunction.keyboardType = UIKeyboardTypeDefault;
            textFieldFunction.autocapitalizationType = UITextAutocapitalizationTypeWords;
        }
        textFieldFunction.backgroundColor = [UIColor clearColor];
        textFieldFunction.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        textFieldFunction.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
        textFieldFunction.textAlignment = UITextAlignmentLeft;
        textFieldFunction.tag = 0;
        //playerTextField.delegate = self;

        textFieldFunction.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [textFieldFunction setEnabled: YES];

        [cell addSubview:textFieldFunction];

        [textFieldFunction release];
    }
    // Kundenbeziehung
    else if ([indexPath section] == 4) {
        UITextField *textFieldCustomer= [[UITextField alloc] initWithFrame:CGRectMake(120, 10, 185, 30)];
        textFieldCustomer.adjustsFontSizeToFitWidth = YES;
        textFieldCustomer.textColor = [UIColor blackColor];
        textFieldCustomer.placeholder = @"Musterfirma AG";
        textFieldCustomer.keyboardType = UIKeyboardTypeDefault;
        textFieldCustomer.backgroundColor = [UIColor clearColor];
        textFieldCustomer.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        textFieldCustomer.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
        textFieldCustomer.textAlignment = UITextAlignmentLeft;
        textFieldCustomer.tag = 0;

        textFieldCustomer.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [textFieldCustomer setEnabled: YES];

        [cell addSubview:textFieldCustomer];

        [textFieldCustomer release];
    }
    // Lieferantenbeziehung
    else {
        UITextField *textFieldSupplier= [[UITextField alloc] initWithFrame:CGRectMake(120, 10, 185, 30)];
        textFieldSupplier.adjustsFontSizeToFitWidth = YES;
        textFieldSupplier.textColor = [UIColor blackColor];
        textFieldSupplier.placeholder = @"Lieferanten AG";
        textFieldSupplier.keyboardType = UIKeyboardTypeDefault;
        textFieldSupplier.backgroundColor = [UIColor clearColor];
        textFieldSupplier.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        textFieldSupplier.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
        textFieldSupplier.textAlignment = UITextAlignmentLeft;
        textFieldSupplier.tag = 0;

        textFieldSupplier.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [textFieldSupplier setEnabled: YES];

        [cell addSubview:textFieldSupplier];

        [textFieldSupplier release];
    }
}
if ([indexPath section] == 0) {
    if ([indexPath row] == 0) { 
        // Vorname
        cell.textLabel.text = @"Vorname";
    }
    else {
        // Nachname
        cell.textLabel.text = @"Nachname";
    }
}
// Kontaktdaten
else if ([indexPath section] == 1) {
    if ([indexPath row] == 0) { 
        cell.textLabel.text = @"Telefon";
    }
    else if ([indexPath row] == 1) {
         cell.textLabel.text = @"Fax";
    }
    else if ([indexPath row] == 2) {
        cell.textLabel.text = @"Mobil";
    }
    else if ([indexPath row] == 3) {
        cell.textLabel.text = @"E-Mail";
    }
    else if ([indexPath row] == 4) {
        cell.textLabel.text = @"WWW";
    }
    else {
        cell.textLabel.text = @"Sprache";
    }
}
// Adresse
else if ([indexPath section] == 2) {
    if ([indexPath row] == 0) { 
        cell.textLabel.text = @"Straße";
    }
    else if ([indexPath row] == 1) {
        cell.textLabel.text = @"PLZ";
    }
    else if ([indexPath row] == 2) {
        cell.textLabel.text = @"Ort";
    }
    else {
        cell.textLabel.text = @"Land";
    }
}
// Section Abteilung und Funktion
else if ([indexPath section] == 3) {
    if ([indexPath row] == 0) { 
        cell.textLabel.text = @"Abteilung";
    }
    else {
        cell.textLabel.text = @"Funktion";
    }
}
// Section Kundenbeziehung
else if ([indexPath section] == 4) {
        cell.textLabel.text = @"Kunde";
}
// Section Lieferantenbeziehung
else {
    cell.textLabel.text = @"Lieferant";
}
return cell;    

} }

I think the cells can not store my data/subviews when i reuse them. 我认为当我重用它们时,单元格无法存储我的数据/子视图。 Is there any way to solve the problem? 有什么方法可以解决这个问题吗?

Thanks! 谢谢! Christoph 克里斯托夫

dequeueReusableCellWithIdentifier returns you reusable cell, if any. dequeueReusableCellWithIdentifier返回可重用的单元格(如果有)。 It means if some cell is not visible, iOS will not create a UITableViewCell again. 这意味着如果某些单元格不可见,iOS将不会再次创建UITableViewCell。 It will directly return used cell. 它会直接返回用过的电池。 It makes performance better and memory utilization low. 它使性能更好,内存利用率更低。

So, when you identify cell is nil, you should create a cell and textfield. 因此,当您识别单元格为零时,您应该创建单元格和文本字段。 Add the textfiled as a subview of a cell. 添加文本作为单元格的子视图。

Outside of cell is nil, you should provide other attributes of textfiled. 在单元格之外是nil,你应该提供textfiled的其他属性。 You have done same thing for cell.textLable.text. 你已经为cell.textLable.text做了同样的事情。 You need to carry same exercise for textfiled also. 你也需要为textfiled进行相同的练习。 To fetch the textField, tag while adding. 要在添加时获取textField,标记。 Using that tag, you can fetch textField back. 使用该标记,您可以返回textField。

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

// Add a UITextFiel
    if ([indexPath section] == 0) {
        UITextField *textFieldName = [[UITextField alloc] initWithFrame:CGRectMake(120, 10, 185, 30)];
        textFieldName.adjustsFontSizeToFitWidth = YES;
        textFieldName.textColor = [UIColor blackColor];
        textFieldName.tag = 25;
        if ([indexPath row] == 0) {
            textFieldName.placeholder = @"Max";
            textFieldName.keyboardType = UIKeyboardTypeDefault;
            textFieldName.returnKeyType = UIReturnKeyDone;
 textFieldName.backgroundColor = [UIColor clearColor];
        textFieldName.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        textFieldName.autocapitalizationType = UITextAutocapitalizationTypeWords; // no auto capitalization support
        textFieldName.textAlignment = UITextAlignmentLeft;
[cell addSubview:textFieldName];

        [textFieldName release];
        }
    }
}

//Here fetch the textFiled..
UITextFiled *tField = [cell viewWithTag:25];
//Identify row, section and do other operations like setting text, place holder etc...

You only add a UITextView if the cell is a newly created cell, so if the cell is re-used then the UITextview gets re-used as well. 如果单元格是新创建的单元格,则只添加UITextView,因此如果重新使用单元格,则UITextview也会重新使用。 To get around this you could either: 要解决这个问题,您可以:

Move all your UITextView creation code out of the if (cell == nil) statement 将所有UITextView创建代码移出if(cell == nil)语句

or 要么

When you set the cell.textlabel.text find a way of accessing the textview thats already added to the cell (using the tag property, or looping through the subviews) and make changes to it. 设置cell.textlabel.text时,找到一种方法来访问已添加到单元格中的textview(使用tag属性或循环遍历子视图)并对其进行更改。

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM