2015-04-22 3 views
2

У меня есть UITextField в пользовательской ячейке. Как только я ввел значение в первую и вторую ячейки, и когда я прокручиваю индекс поля UITableView, меняются (значение первой ячейки меняется на последнюю ячейку). Может ли кто-нибудь помочь мне решить мою проблему?Пользовательские изменения индекса текстового поля на прокрутке

Вот мой код:

static NSString *cellIdentifier = @"TableCellID"; 

CustomTableViewCell *cell = (CustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell == nil) {   
    cell = [[CustomTableViewCell alloc] init]; // or your custom initialization 
} 

cell.accessoryType = UITableViewCellAccessoryNone; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 

cell.txt_TCelltext.tag=indexPath.row; 
[email protected]"0.00"; 

[cell.txt_TCelltext setDelegate:self]; 

enter image description here

+0

Пожалуйста, попробуйте после удаления этой строки: cell.txt_TCelltext.tag = indexPath.row; –

+2

Сохраните свое значение в источнике данных и используйте его с помощью indexPath, иначе значения будут взаимозаменяемы из-за повторного использования соты. – iphonic

+0

Вам нужно понять, как работают многоразовые ячейки.Когда вы используете повторно используемую ячейку, ячейка, которая выходит из поля зрения, повторно используется для входящей ячейки. Поэтому 'txt_TCelltext' получает данные в дополнение к тому, что он уже имеет, поскольку номер строки изменяется для строки, которая находится в представлении прямо сейчас. – Krishna

ответ

2

Вы можете написать ниже код в Viewdidload и ячейку для строки по пути индекса.

arrCells = [NSMutableArray new]; 

for (int i = 0; i < [[dic_demo objectForKey:@"Demo"] count]; i++) { 
    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil]; 
    CustomTableViewCell *cell = [objects objectAtIndex:0]; 
    [arrCells addObject:cell]; 

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

CustomTableViewCell *cell = [arrCells objectAtIndex:indexPath.row]; 
} 

Надеется, что это поможет вам

+0

Этот трюк работал .. Спасибо –

0

Если клетка вновь создана, вы назначаете заполнитель/текст к тексту, поданный. Но если одна и та же ячейка повторно используется и вызывается для повторно использованной ячейки, вы не назначали местозаполнитель/текст в текстовое поле из источника данных текущего пути индекса, чем в текстовом файле будут отображаться данные для предыдущего пути индекса, ячейка была создана. Поэтому для решения проблемы вам нужно назначить текст текстовому полю на основе текста для текущего пути указателя, независимо от того, какая ячейка была вновь создана или повторно использована.

Чтобы решить эту проблему, у вас есть два options-

1) обновлять содержание многоразовых клеток текстового поля с данными текстового поля для текущего индекса пути

2) в случае многоразового высвобождения клеток предыдущее текстовое поле и создать новый, инициализируйте данные для текущей строки.

Второй подход предполагает некоторые накладные расходы, поэтому я предлагаю вам решить вашу проблему с помощью первого подхода.

Пример кода с использованием первой приступающим

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 
    cell.backgroundColor=[UIColor clearColor]; 
    UITextField *textField = nil; 

     if (cell == nil) 
     { 
      cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"]; 
     } 

    // assign placeholder text to text field 
    [cell.textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]]; 

    return cell; 
} 

Пример кода с использованием 2-го приступающим

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 
    cell.backgroundColor=[UIColor clearColor]; 
    UITextField *textField = nil; 

     if (cell == nil) 
     { 
      cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"]; 
     } 

    textField = [[cell contentView] viewWithTag:indexPath.row]; 
    if(textField ! = nil) 
      [textField removeFRomSuperView]; 

    textField = [[UITextField alloc] initWithFrame:CGRectZero]; 

    // customize text filed 

    // assign placeholder text to text field 
    [textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]]; 

    [textField setTag:indexPath.row]; // set tag on text field 

    [[cell contentView] addSubview:textField]; 

    [textField release]; 

    return cell; 
} 

Примечание: Приведенный выше пример кода только приблизительное представление, пожалуйста, используйте вышеуказанный источник/настроить его в соответствии с вашими требованиями.

+0

, пожалуйста, добавьте пример кода –

+0

, я буду сделайте это –

+0

@RakeshKumar, я обновил свой ответ с образцом кода, показывающим оба подхода. –

0
static NSString *cellIdentifier = @"TableCellID"; 
in place of this line 
use NSString *cellIdentifier = [NSString stringWithFormat:@"Cell_%d_%d", indexPath.section, indexPath.row]; 
+0

это нехороший подход, потому что он каждый раз создает новую ячейку и занимает много памяти. –

+0

Вы правы, но это зависит от требований, если у вас есть простые текстовые ячейки, на которые вы можете пойти. Иногда вы должны поддерживать компромисс. –

3

Это из-за использования ячейки. Попытайтесь заполнить данные UITextField из массива словаря (или). Попробуйте это:

- (UITableViewCell *)tableView:(UITableView *)tableViewLocal 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Your Code 

    UITextField *textField = [[UITextField alloc]init]; 
    textField.delegate = self; 
    textField.tag = indexPath.row; 

    if ([myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]]) 
    { 
     textField.text = [[myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]]; 
    } 
} 

-(void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    [myTextFieldDictionary setValue:textField.text 
          forKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]];  
} 
+0

Первое значение ячейки - это печать в последней ячейке. –

+0

Отредактировав мой ответ, попробуйте его –

+0

@ user007007: У меня такая же проблема, пожалуйста, поделитесь электронной почтой. Я отправлю свой демо-источник в u..you можете проверить с этим –

0

Разместите BreakPoint в функции ниже, и вы можете видеть, что вызывается каждый раз, когда клетка становится видимой и, следовательно, ваш код внутри этой функции сбрасывает текст в текстовом поле. Если что-то вас поразило, не ждите! вы можете решить его с помощью своего собственного кода.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
Смежные вопросы