2011-01-01 21 views
0

2つのテキストフィールドがUItableViewにあります。ビルドはエラーなしで完了しています。ログインの詳細を入力し、UINavControllerでSubmitボタンを押すと、最初のフィールドは(null)として返されます。私はそれが起こっている理由を見つけることができません。 :(ここUITableViewセルのUITextFieldが(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

1つの問題は、テーブルがセルを再作成する必要があるときはいつでも、テキストフィールドを再作成し続けることです。これは、単一セルに対して複数回発生する可能性があります。コントロールのタグプロパティを使用するなど、値を取得するためにこれらのテキストフィールドに後でどのようにアクセスするかは表示されません。

セルをデキューすると、そのセルにはサブビューがそのまま残っているため、新しいテキストフィールドを毎回作成するのではなく、tagプロパティを使用して既に存在するテキストフィールドを取得してそのテキストを更新する必要があります。

また、埋め込みテキストフィールドに簡単にアクセスできるプロパティを持つテキストフィールドを含むカスタムUITableViewCellサブクラスを作成する方がよいでしょう。次に、tableView:didSelectRowWithIndexPath:メソッドでは、選択した行の特定のセルにアクセスできます。セルを取得するには、cellForRowAtIndexPath:メッセージをtableViewインスタンスに送信します。セルを取得したら、カスタムプロパティにアクセスしてユーザー名とパスワードを取得できます。

+0

タグプロパティを使用するにはどうすればよいですか?申し訳ありませんが、使用方法はわかりません。 :( –

+0

とにかく、それを整理しました。:)ありがとう。 :) –

+0

すべてのUIViewにはNSIntegerに設定できるタグプロパティがあります。次に、viewForTag:メッセージを送信して親ビューに問い合わせることができます。したがって、セルがある場合は、[cell.contentView viewForTag:100]のような処理を行い、その結果を正しい派生クラスにキャストすることができます。例:UITextField * textField =(UITextField *)[cell.contentView viewForTag:100]; –

関連する問題