UITextFields се припокриват след превъртане на UITableView

Имам UITableView с UITextFields, за да направя формуляр. Изглежда страхотно - ОСВЕН когато превъртате, новите UITextFields се поставят върху старите... Не мога да разбера защо! Знам, че когато клетката се използва повторно (т.е. dequeueReusableCellWithIdentifier връща не-nil), клетката се връща със съществуващия UITextField. Намерих решение, където да поддържам уникалността на таговете, ще бъде по-добре да премахна всички предишни UITextField. Но аз не искам да правя това. В края, когато този формуляр бъде изпратен, искам да взема всички стойности от текстовите полета (не мога да направя това, ако ги премахна)..

Ето кода. Всяка помощ се оценява!

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

static NSString *CellIdentifier = @"Cell";

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

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

cell.accessoryType = UITableViewCellAccessoryNone;

UITextField *playerTextField = [[UITextField alloc] initWithFrame:CGRectMake(155, 15, 130, 30)];
playerTextField.adjustsFontSizeToFitWidth = YES;
playerTextField.textColor = [UIColor blackColor];

if (indexPath.row == 0) {
    playerTextField.placeholder = @"Unique ID Sample";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyNext;
}

else if (indexPath.row == 1) {
    playerTextField.placeholder = @"Common Name";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if (indexPath.row == 2) {
    playerTextField.placeholder = @"Scientific Name";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 3) {
    playerTextField.placeholder = @"03/25/1992";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 4) {
    playerTextField.placeholder = @"Male";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
} 

else if ([indexPath row] == 5) {
    playerTextField.placeholder = @"03/01/2012";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 6) {
    playerTextField.placeholder = @"Huntington, WV";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 7) {
    playerTextField.placeholder = @"Huntington, WV";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 8) {
    playerTextField.placeholder = @"Marshall University";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
} 
else if ([indexPath row] == 9) {
    playerTextField.placeholder = @"Sub Straight";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 10) {
    playerTextField.placeholder = @"Any Light";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 11) {
    playerTextField.placeholder = @"Temperature";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 12) {
    playerTextField.placeholder = @"A Lot";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
} 

else if ([indexPath row] == 13) {
    playerTextField.placeholder = @"All Types";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 14) {
    playerTextField.placeholder = @"Schedule";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 15) {
    playerTextField.placeholder = @"MM/DD/YYYY";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 16) {
    playerTextField.placeholder = @"Ate Someone";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
} 

else if ([indexPath row] == 17) {
    playerTextField.placeholder = @"MM/DD/YYYY";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 18) {
    playerTextField.placeholder = @"The Morgue";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 19) {
    playerTextField.placeholder = @"MM/DD/YYYY";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}

else if ([indexPath row] == 20) {
    playerTextField.placeholder = @"MM/DD/YYYY";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
} 

else if ([indexPath row] == 21) {
    playerTextField.placeholder = @"To/ From";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyDone;
}    

playerTextField.backgroundColor = [UIColor whiteColor];
playerTextField.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
playerTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
playerTextField.textAlignment = UITextAlignmentLeft;
playerTextField.tag = 0;

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

    [cell addSubview:playerTextField];

[playerTextField release];

cell.textLabel.text = [self.options objectAtIndex:indexPath.row];


return cell;    
}

person nilloc1221    schedule 11.04.2012    source източник
comment
Защо ви се добавя едно и също свойство толкова много пъти?   -  person Vineesh TP    schedule 21.10.2014


Отговори (3)


Ще трябва да създадете персонализиран UITableViewCell. Това ще ви позволи да създадете ivar с UITextField, до който имате директен достъп. По този начин, когато клетката се извади от опашката и се използва повторно, можете просто да зададете кога имате нужда от нея. Не забравяйте да замените prepareForReuse: във вашия подклас на клетка и да нулирате всички свойства на добавените от вас компоненти.

Друго нещо, което може да ви помогне с вашия код по-горе, е използването на typedef enum вместо използване на цели числа, за да определите какъв тип клетка е:

typedef enum{
    PlayerFieldId = 0,
    PlayerFieldName,
    PlayerFieldGender
} PlayerFields

След това във всяка от персонализираните ви клетки можете да зададете типа на клетката чрез enum по-горе и команда за превключване:

switch(type){
case PlayerFieldId:
    playerTextField.placeholder = @"Unique ID Sample";
    playerTextField.keyboardType = UIKeyboardTypeDefault;
    playerTextField.returnKeyType = UIReturnKeyNext;
    break;
    /* other fields here */
}
person larsacus    schedule 11.04.2012

Можете да класифицирате UITableViewCell и да имате свойство UITextField, което просто задавате за всяка клетка, вместо да добавяте постоянно нова, ако не искате да ги премахнете.

person Jesse Naugher    schedule 11.04.2012

Използвайте следния оператор, за да създадете екземпляр на клетка.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

for (UITextView *txtView in cell.contentView.subviews)
{
    if ([txtView isKindOfClass:[UITextView class]])
    {
        [txtView removeFromSuperview];
    }
}

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
person Badruduja    schedule 21.10.2014