Обработка одного uitextfield в UITableView - PullRequest
2 голосов
/ 28 июня 2010

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

Мой более ранний подход состоял в том, чтобы просто выделить разные текстовые поля для разного пользовательского ввода, просто, но выдает сбой пользовательского интерфейса, когда есть много textField (ов), поэтому хочу избежать этого.

для лучшего понимания вот пример кода для метода делегата таблицы cellAtIndexRow

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellTableIdentifier = @"CellTableIdentifier";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];

    if (cell == nil) {
        // Create a new cell. CGRectZero allows the cell to determine the appropriate size.

        CGRect cellFrame  = CGRectMake(0,0,300,65);

        cell = [[[UITableViewCell alloc] initWithFrame:cellFrame reuseIdentifier:CellTableIdentifier] autorelease];

        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(8,4,284,25)];
        textField.delegate = self;
        textField.returnKeyType = UIReturnKeyDone;
        textField.tag = kTagAddContactTextField;        
        textField.backgroundColor = [UIColor orangeColor];
        [cell.contentView addSubview:textField];
        [textField release];

    }

    UITextField *textField = (UITextField*)[cell.contentView viewWithTag:kTagAddContactTextField];

    switch (indexPath.row) {
        case 0:
            [textField setPlaceholder:@"First Name"];
            break;
        case 1:
            [textField setPlaceholder:@"Last Name"];            
            break;
        case 2:
            [textField setPlaceholder:@"Email"];            
            textField.autocorrectionType = UITextAutocorrectionTypeNo;          
            textField.autocapitalizationType =  UITextAutocapitalizationTypeNone;
            textField.keyboardType = UIKeyboardTypeEmailAddress;
            break;


    }

    //cell.textLabel.text = @"Test";


    return cell;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{

    //here is the place where I wann to handle various text fields and store there values.

        return YES;

}

Ответы [ 4 ]

0 голосов
/ 28 июня 2010

Несколько способов варьировать болезненность:

  • Используйте разные идентификаторы и теги повторного использования для каждого типа ячеек и включите тег. Это означает, что клетки не используются повторно, как они могли бы быть, но это не конец света.
  • Следуйте UIView.superview, пока не найдете подкласс UITableViewCell (textField.superview.superview должен работать, но это может измениться в будущих версиях iPhone OS), а затем используйте [tableView indexPathForRow: cell].
  • Используйте разные идентификаторы повторного использования (но один и тот же тег), следуйте цепочке суперпредставлений, пока не найдете UITableViewCell и не посмотрите на его идентификатор повторного использования.
  • Используйте пользовательский подкласс UITableViewCell, в котором хранится ключ NSString * или NSInteger, чтобы вы знали, какая это ячейка (опционально, сделайте ячейку делегатом текстового поля и попросите ее уведомить контроллер представления об изменении).
  • Включить текст заполнителя (очень неприглядно, когда дело доходит до i18n)
0 голосов
/ 28 июня 2010

вы можете использовать свойство tag для UIView (которое наследует UITextField).

, например

 switch (indexPath.row) {
        case 0:
            [textField setPlaceholder:@"First Name"];
            textField.tag=1;//Name
            break;
        case 1:
            [textField setPlaceholder:@"Last Name"]; 
             textField.tag=2;//Surname           
            break;
        case 2:
            [textField setPlaceholder:@"Email"]; 
            textField.tag=3;//Email           
            textField.autocorrectionType = UITextAutocorrectionTypeNo;          
            textField.autocapitalizationType =  UITextAutocapitalizationTypeNone;
            textField.keyboardType = UIKeyboardTypeEmailAddress;
            break;


    }

и в вашем обратном вызове:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{

//here is the place where I wann to handle various text fields and store there values.
    switch(textField.tag)
    {
       case 1://Name

            // do stuff;
      break;
         case 2://Surname
           // do stufff;
        break;
        case 3://Email
          //do stuff;
       break;
    }

    return YES;

}

0 голосов
/ 28 июня 2010

Каждый раз, когда пользователь выбирает текстовое поле для редактирования, didSelectRowAtIndexPath должен вызываться.Там вы можете переключить значение на свойство int currentEdited, из которого вы можете определить, что изменял пользователь.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
   switch(indexPath.row)
   {
      case 0:currentEditing = kEditingFirstName;
      break;

      case 1:....

      ...
   } 

}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{

    switch(currentEditing)
    {
       case kEditingFirstName:
            //store first name
            break;

       ....
    }
    return YES;
}

Использование тегов в других ответах может привести к проблемам из-заиспользование текстового поля.

0 голосов
/ 28 июня 2010

Попробуйте потянуть

textField.tag = kTagAddContactTextField;

из кода создания ячейки таблицы и назначьте разные значения тега для каждой строки в вашем UITable.

switch (indexPath.row) {
    case 0:
textField.tag = kFirstNameField;
        [textField setPlaceholder:@"First Name"];
        break;
    case 1:
textField.tag = kLastNameField;
        [textField setPlaceholder:@"Last Name"];            
        break;
    case 2:
textField.tag = kEmail;
        [textField setPlaceholder:@"Email"];            
        textField.autocorrectionType = UITextAutocorrectionTypeNo;          
        textField.autocapitalizationType =  UITextAutocapitalizationTypeNone;
        textField.keyboardType = UIKeyboardTypeEmailAddress;
        break;


}

Затем вы можете различить, какое текстовое поле вы получаете по возвращенному тегу.

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