2011-01-01 3 views
0

Два текстовых поля находятся в UItableView. Сборка завершается без ошибок. Когда я вхожу в регистрационную информацию и нажимаю кнопку отправки в UINavController, первое поле возвращается как (null). Я не могу найти причину, по которой это происходит. :(UITextField в ячейке UITableView возвращается как (null)

Вот код, который я использую:

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
              reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Configure the cell. 

    if ([indexPath section] == 0) { 
     tUser = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)]; 
     tUser.adjustsFontSizeToFitWidth = YES; 
     tUser.textColor = [UIColor blackColor]; 

     tPass = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)]; 
     tPass.adjustsFontSizeToFitWidth = YES; 
     tPass.textColor = [UIColor blackColor]; 

      if ([indexPath row] == 0) { 
       tUser.placeholder = @"[email protected]"; 
       tUser.keyboardType = UIKeyboardTypeEmailAddress; 
       tUser.returnKeyType = UIReturnKeyNext; 
      } 
      if ([indexPath row] == 1) { 
       tPass.placeholder = @"Required"; 
       tPass.keyboardType = UIKeyboardTypeDefault; 
       tPass.returnKeyType = UIReturnKeyDone; 
       [tPass addTarget:self 
             action:@selector(save:) 
       forControlEvents:UIControlEventEditingDidEndOnExit]; 

       tPass.secureTextEntry = YES; 
      } 
     } 

     tUser.autocorrectionType = UITextAutocorrectionTypeNo; 
     tUser.autocapitalizationType = UITextAutocapitalizationTypeNone; 
     tUser.textAlignment = UITextAlignmentLeft; 

     tPass.autocorrectionType = UITextAutocorrectionTypeNo; 
     tPass.autocapitalizationType = UITextAutocapitalizationTypeNone; 
     tPass.textAlignment = UITextAlignmentLeft; 

     tUser.clearButtonMode = UITextFieldViewModeNever; 
     tPass.clearButtonMode = UITextFieldViewModeNever; 

     [tUser setEnabled:YES]; 
     [tPass setEnabled:YES]; 

     //[tUser release]; 
     //[tPass release]; 

    // Email & Password Section 
     if ([indexPath row] == 0) { // Email 
      cell.textLabel.text = @"Username"; 
      [cell addSubview:tUser]; 
     } 
     else { 
      cell.textLabel.text = @"Password"; 
      [cell addSubview:tPass]; 
     } 

    return cell;  
} 

================

-(IBAction) save: (id) sender { 

     if ([tPass text] == nil) { 
      UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"Error" 
                  message:@"There was no password entered, please enter the correct password and try again." 
                  delegate:self 
                cancelButtonTitle:@"Okay" 
                otherButtonTitles:nil]; 
      [alertV show]; 
      [alertV release]; 
     } 
     else { 
      NSLog(@"we can do something here soon..."); 

      //NSString *tUserString = [[NSString alloc] initWithFormat:@"Hello: %@", tUser.text]; 

      NSLog(@"We saved their username: %@", [tUser text]); 
      NSLog(@"We saved their password: %@", [tPass text]); 


     } 

    } 

Любая помощь будет значительно оценивается. :)

+0

Не могли бы вы показать код, где вы оцениваете текстовые поля? – fabian789

+0

Почему вы проверяете '[indexPath section] == 0' 3 разное время? –

+0

@ fabian789 Я редактировал свой пост. Пожалуйста, проверь это. :) –

ответ

0

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

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

Кроме того, лучшим подходом было бы создание пользовательского подкласса UITableViewCell, который включает текстовое поле со свойствами, позволяющими вам легко получить доступ к встроенным текстовым полям. Затем в вашем методе tableView:didSelectRowWithIndexPath: вы можете получить доступ к определенной ячейке выбранной строки. Чтобы получить ячейку, вы отправляете сообщение cellForRowAtIndexPath: экземпляру tableView. После того, как у вас есть ячейка, вы можете получить доступ к пользовательским свойствам, чтобы получить имя пользователя и пароль.

+0

Как я могу использовать свойство тега, извините, но я не знаю, как его использовать. :( –

+0

Anyways, разобрался. :) Спасибо. :) –

+0

Каждый UIView имеет свойство тега, которое может быть установлено в NSInteger. Затем вы можете запросить родительское представление, отправив ему сообщение viewForTag:. Поэтому, если у вас есть ячейка, вы можете сделать что-то вроде [cell.contentView viewForTag: 100] и передать результат в правильный производный класс. Например: UITextField * textField = (UITextField *) [cell.contentView viewForTag: 100]; –

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