UITableView ячейка / данные исчезают - PullRequest
1 голос
/ 13 апреля 2011

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

Вид таблицы не полностью умещается на экране iPad, и я не могу получить доступ ко всем невидимым ячейкам для чтения / сохранения данных.И когда я делаю изменения в «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;
}

Ответы [ 5 ]

3 голосов
/ 13 апреля 2011

Прежде всего: вам не нужно загружать все ячейки, включая невидимые. В этом весь смысл UITableView и MVC Pattern: отделите ваши представления от ваших данных.

Что вы захотите сделать, это обновить ваш источник данных (то есть idenInfoRez, prodInfoRez и vizInfoRez в вашем случае), когда пользователь изменил значение внутри textField. Таким образом, вам придется установить свой UIViewController в качестве делегата каждого текстового поля и обновлять значения по мере ввода пользователем.

1 голос
/ 02 марта 2012

[UIView beginAnimations: @ контекст ShiftUp: ноль]; [UIView setAnimationDuration: 0,0001]; - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { NSInteger section = [indexPath section];

static NSString *CellIdentifier = @"Cell";

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

if (cell == nil) {

    [[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 останется прежним в прежнем состоянии !! Не фиксируйте анимацию, иначе она не будет работать !!

0 голосов
/ 03 сентября 2012

каждый раз, когда мы выделяем ячейку для различных данных, данные не будут перезагружать ячейку, каждый раз, когда данные переопределяют предыдущие данные, прежде чем выделить ячейку для очистки ячейки, например, как cell = nil

       - (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 голосов
/ 29 сентября 2011

Что вы можете сделать, это: в событии Editing Changed каждого из 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 в соответствии с количеством ячеек.

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

0 голосов
/ 13 апреля 2011

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

Удалить это:

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).


Лучшим решением было бы оставить повторное использование ячеек и заполнять их текстовые поля по мере необходимости. Подход отличается от приложения к приложению, но в принципе вы никогда не должны получать прямой доступ к ячейкам и хранить данные ячейки где-то еще, например. NSArray из NSStrings. Затем вы можете манипулировать NSArray. Ваш метод cellForRowAtIndexPath будет выглядеть примерно так:

textField.text = [arrData objectAtIndex:indexPath.row];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...