2010-06-28 2 views
2

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

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

для лучшего понимания здесь приведен пример кода для метода таблицы делегата 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; 

} 
+0

Обратите внимание, что вам нужно установить autocorrectionType/autocapitalizationType/keyboardType в строках 0 и 1, в случае, если ячейка из строки 2 повторно используется. –

ответ

0

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

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; 


} 

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

0

Вы можете использовать свойство «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

За исключением того, что вам нужно найти все три тега, чтобы найти textField, чтобы переустановить его на правильный (в случае повторного использования соты). –

+0

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

-1

Всякий раз, когда пользователь выбрал текстовое поле для редактирования 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

Это не всегда так, когда вы касаетесь внутри текстового поля, didSelectRowAtIndexPath не будет вызываться, но соответствующее текстовое поле делегирует – Ameya

0

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

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

любой код фрагмента для ситуации, подобной мне выше. – Ameya

Смежные вопросы