Получение ссылки на UITextField, который находится на UITableViewCell? - PullRequest
0 голосов
/ 08 сентября 2011

На самом деле я использую следующую и предыдущую кнопку для перемещения одной ячейки в другую, и каждая ячейка имеет текстовое поле, поэтому, когда я нажимаю на следующую кнопку, она перемещает меня к следующей ячейке, и, получив ссылку на эту ячейку, я могу создать текстовое поле. стать первым респондентом, но когда я нажимаю на предыдущую кнопку, он не возвращает мне ссылку. Код, который я использую для следующего и предыдущего, приведен ниже

- (IBAction)nextPrevious:(id)sender
{
    NSIndexPath *indexPath ;
    BOOL check = FALSE;

    if([(UISegmentedControl *)sender selectedSegmentIndex] == 1){
        if(sectionCount>=0 && sectionCount<8){
            //for next button
            check = TRUE;
            sectionCount = sectionCount+1;
            indexPath = [NSIndexPath indexPathForRow:0 inSection:sectionCount];
        }
    }else{
        //for previous button
        if(sectionCount>0 && sectionCount<=9){
            check = TRUE;
            sectionCount = sectionCount-1;

            indexPath = [NSIndexPath indexPathForRow:0 inSection:sectionCount];
        }
    }

    if(check == TRUE){
        //[registrationTbl reloadData];
        UITableViewCell *cell = [registrationTbl cellForRowAtIndexPath:indexPath];

        for(UIView *view in cell.contentView.subviews){
            if([view isKindOfClass:[UITextField class]]){
                    [(UITextField *)view becomeFirstResponder];
                    break;
            }
        }

        [registrationTbl scrollToRowAtIndexPath:indexPath
                               atScrollPosition:UITableViewScrollPositionTop
                                       animated:YES];


        // UITextField *field = (UITextField *) [cell.contentView viewWithTag:indexPath.section];
        // [field becomeFirstResponder];
    }

Любое маленькое предложение будет высоко ценится. Заранее спасибо

1 Ответ

1 голос
/ 08 сентября 2011

Проблема заключается в прокрутке. При прокрутке до верхней части следующей строки предыдущая строка удаляется и повторно используется для последней видимой строки, что означает, что метод cellForRowAtIndexPath:, вероятно, вернет значение null, поскольку ячейка в данный момент недоступна.

Быстрое и грязное исправление включало бы прокрутку до середины или немного смещение, поэтому ячейка все еще видна. Не так быстро и грязно потребовалось бы создать процедуру, которая прокручивает таблицу, чтобы убедиться, что ячейка видна, а затем, когда прокрутка прекращается, установите текстовое поле в качестве первого респондента.

( Edit ) Чтобы объяснить немного больше, этот последний подход. Допустим, вы добавили новую переменную NSIndexPath *indexPathEditing. Метод делегата tableView:cellForRowAtIndexPath: будет иметь:

if (indexPathEditing && indexPathEditing.row == indexPath.row && indexPathEditing.section == && indexPath.section)
{
    // Retrieve the textfield with its tag.
    [(UITextField*)[cell viewWithTag:<#Whatever#>] becomeFirstResponder];
    indexPathEditing = nil;
}

Это означает, что если установлено значение indexPathEditing, а текущая загружаемая строка видна, оно автоматически установит себя как firstResponder.

Затем, например (в вашем nextPrevious: методе), все, что вам нужно сделать, это:

indexPathEditing = [NSIndexPath indexPathForRow:0 inSection:sectionCount];

[registrationTbl scrollToRowAtIndexPath:indexPathEditing
                       atScrollPosition:UITableViewScrollPositionTop
                               animated:YES];
[registrationTbl reloadData];

Появится строка, будет вызван tableView:cellForRowAtIndexPath:, и он автоматически будет установлен как firstResponder.

Также обратите внимание, что вместо выполнения for с isKindOfClass проще установить номер тега, а затем получить объект с помощью viewWithTag:, я включил это в пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...