简体   繁体   中英

iOS 6 UITextField inside UITableViewCell with sections get wrong data on scrolling

So basically I am getting the wrong data on every textField by scrolling my TableView (Everything is mixed up). I know, this is because the awesome optimization of the reusable cells in the UITableView, so the indexpath are changing constantly, but still I don't know how to solve this.

Having an UILabel in the same cell I solved this problem by adding a specific tag in every label view, so the tableview knows which data is going to return on a view but for some reason this is not possible for my textfield view.

Here is my code:

#define DESCRIPTION_TAG 10
#define TEXTFIELD_TAG 11
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static NSString *CellIdentifier = @"Description Cell";
// Intatiating  my own TableViewCell
CustomLocationCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (!cell){
    cell = [[CustomLocationCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

cell.rowText = (UILabel *) [cell viewWithTag:DESCRIPTION_TAG]; // returning view with unique tag
cell.rowTextField = (UITextField *)[cell viewWithTag:TEXTFIELD_TAG]; // NOT WORKING!!! Data get mix up
cell.rowTextField.delegate = cell; // sending the delegate to custom class cell
cell.delegate = self; // make connection with my @protocol

switch (indexPath.section) {
    case 0:
        cell.rowText.text = [self.descriptions objectAtIndex:indexPath.row];
        cell.rowTextField.placeholder = [self.descriptionsPlaceholder objectAtIndex:indexPath.row];
        break;
    case 1:
        cell.rowText.text = [self.rooms objectAtIndex:indexPath.row];
        cell.rowTextField.placeholder = [self.contentPlaceholder objectAtIndex:indexPath.row];
        break;

    default:
        break;
}
return cell;

}

Any help is appreciated.

Here is an update of my data source: On my CustomTableViewCell I do have outlets for my UILabel and UITextfield

// UITableView DataSource

- (NSArray *)sections
{
    if (!_sections){
        _sections = [[NSArray alloc] initWithObjects:@"First Description", @"Second Descriptions", nil];
    }
    return _sections;
}

- (NSMutableArray *)rooms
{
    if (!_rooms){
        _rooms = [[NSMutableArray alloc] init];
    }
    return _rooms;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.sections.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    switch (section) {
        case 0:
            return [self.descriptions count];
            break;
        case 1:
            return [self.rooms count];
            break;
        default:
            break;
     }
    return 0;
}

I'm not sure exactly what you're trying to accomplish, but here's an example that works with labels and text fields with placeholder text. You'll notice that in cellForRowAtIndexPath, I set both the text and placeholder to nil, so that when a cell is reused, it doesn't have the wrong text in it. Also, when doing the text fields, I check if the array has placeholder text at that index, and if so, I reset the placeholder, and if not I reset the text.

In order for the text field delegate methods to work properly, each text filed needs a unique tag (not just one tag for labels and another for text fields) that I set equal to (indexPath.row + 1000*indexPath.section).

#import "TableController.h"
#import "CustomLocationCell.h"

@interface TableController ()
@property (strong,nonatomic) NSArray *descriptions;
@property (strong,nonatomic) NSMutableArray *descriptionsPlaceholder;
@property (strong,nonatomic) NSArray *rooms;
@property (strong,nonatomic) NSMutableArray *contentPlaceholder;
@end

@implementation TableController 


- (void)viewDidLoad {
    [super viewDidLoad];
    self.descriptions = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight"];
    self.descriptionsPlaceholder = [@[@"Placeholder1",@"Placeholder2",@"Placeholder3",@"Placeholder4",@"Placeholder5",@"Placeholder6",@"Placeholder7",@"Placeholder8"] mutableCopy];
    self.rooms = @[@"Room1", @"Room2", @"Room3", @"Room4",@"Room5", @"Room6", @"Room7", @"Room8"];
    self.contentPlaceholder = [@[@"ContentPH1",@"ContentPH2",@"ContentPH3",@"ContentPH4",@"ContentPH5",@"ContentPH6",@"ContentPH7",@"ContentPH8"] mutableCopy];
    [self.tableView reloadData];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.descriptions.count;
}

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

    static NSString *CellIdentifier = @"Description Cell";

    CustomLocationCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    cell.rowTextField.delegate = self;
    cell.rowTextField.tag = indexPath.row + 1000*indexPath.section;
    cell.rowTextField.placeholder = nil;
    cell.rowTextField.text = nil;

    switch (indexPath.section) {
        case 0:
            cell.rowText.text = [self.descriptions objectAtIndex:indexPath.row];
            if ([self.descriptionsPlaceholder[indexPath.row] hasPrefix:@"Placeholder"]) {
                cell.rowTextField.placeholder = [self.descriptionsPlaceholder objectAtIndex:indexPath.row];
            }else{
                cell.rowTextField.text = [self.descriptionsPlaceholder objectAtIndex:indexPath.row];
            }
            break;
        case 1:
            cell.rowText.text = [self.rooms objectAtIndex:indexPath.row];
            if ([self.contentPlaceholder[indexPath.row] hasPrefix:@"ContentPH"]) {
                cell.rowTextField.placeholder = [self.contentPlaceholder objectAtIndex:indexPath.row];
            }else{
                cell.rowTextField.text = [self.contentPlaceholder objectAtIndex:indexPath.row];
            }
            break;
        default:
            break;
    }
    return cell;
}


-(void)textFieldDidEndEditing:(UITextField *)textField {
    if (textField.tag >= 1000 && ![textField.text isEqualToString: @""]) {
        [self.contentPlaceholder replaceObjectAtIndex:textField.tag - 1000 withObject:textField.text];
    }else if (textField.tag < 1000 && ![textField.text isEqualToString: @""]) {
        [self.descriptionsPlaceholder replaceObjectAtIndex:textField.tag withObject:textField.text];
    }
}


-(BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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