Невозможно найти следующего респондента текстового поля - PullRequest
0 голосов
/ 08 января 2012

Я пытаюсь циклически перемещаться / перемещаться по UITextField s, которые я добавил как подпредставления к UITableViewCell s. Однако я не могу получить значение nextResponder в методе textFieldShouldReturn:. Может кто-нибудь посоветовать мне, где мой код пошёл не так?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
    }

    if (indexPath.row == 0) // first name
    {
        cell.textLabel.text = @"First Name:";
        UITextField *tempFirstNameField = [[UITextField alloc]initWithFrame:CGRectMake(100, (44-18)/2, 320-100, 32)];
        self.firstNameField = tempFirstNameField;
        self.firstNameField.font = [UIFont systemFontOfSize:14];
        self.firstNameField.tag = 1;
        self.firstNameField.returnKeyType = UIReturnKeyNext;
        self.firstNameField.delegate = self;
        [tempFirstNameField release];
        [cell.contentView addSubview:self.firstNameField];
    }
    else if (indexPath.row == 1) //last name
    {
        cell.textLabel.text = @"Last Name:";
        UITextField *tempLastNameField = [[UITextField alloc]initWithFrame:CGRectMake(100, (44-18)/2, 320-100, 32)];
        self.lastNameField = tempLastNameField;
        self.lastNameField.font = [UIFont systemFontOfSize:14];
        self.lastNameField.tag = 2;
        self.lastNameField.returnKeyType = UIReturnKeyNext;
        self.lastNameField.delegate = self;
        [tempLastNameField release];
        [cell.contentView addSubview:self.lastNameField];
    }

    return cell;
}

-(BOOL)textFieldShouldReturn:(UITextField*)textField;
{
    NSInteger nextTag = textField.tag + 1;
    NSLog(@"next tag %i",nextTag);
    // Try to find next responder

    UIResponder* nextResponder = [textField.superview.superview viewWithTag:nextTag];
    //This always returns me null value
    NSLog(@"next responder %@", nextResponder);
    if (nextResponder) {
        // Found next responder, so set it.
        [nextResponder becomeFirstResponder];
    } else {
        // Not found, so remove keyboard.
        [textField resignFirstResponder];
    }
    return NO; // We do not want UITextField to insert line-breaks.
}

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Зачем вам нужен tableView для этого, ваши поля кажутся статическими.Используйте простое представление прокрутки, если содержание больше, чем у вас экран.Чтобы зациклить ваши поля, вы можете:

1 / использовать представление контейнера для всех элементов управления, которые вы хотите в цикле навигации, и просто зациклить в ваших подпредставлениях NSArray

2 / лучший выбор.Используйте поле NSUInteger tag, чтобы установить порядок, в котором элементы управления должны получить фокус.Начните с ненулевого значения, потому что 0 является значением тега по умолчанию.10,11,12,13 и используйте viewWithTag: в представлении контейнера для получения следующего элемента управления.

1 голос
/ 08 января 2012

UITableView не является массивом - он может перезагрузить или даже освободить любую ячейку, когда она невидима.

Если вы хотите управлять созданными ячейками - лучше создать их все, поместить в массив и затем отобразить их из массива. То есть создайте их все до начала загрузки таблицы, но не в методе cellForRowAtIndexPath. Это может быть сделано, например, в ViewWillAppear.

В этом случае все ваши объекты будут сохранены массивом и не будут освобождены, пока вы не захотите.

...