2013-05-15 10 views
6

テキストフィールドの書式設定にこのコードMethodを追加しています。私は以下のコードを使ってメソッドを追加しようとしていますが、うまくいかない、何が間違っているのですか?セル内の私のuitextfieldにメソッドを追加しますか?

.hファイル

NSString* phone_; 
UITextField* phoneFieldTextField; 
@property (nonatomic,copy) NSString* phone; 

.mファイル

@synthesize phone = phone_; 

ViewDidLoad{ 
self.phone = @""; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

// Make cell unselectable and set font. 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 
cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:13]; 

if (indexPath.section == 0) { 

    UITextField* tf = nil; 
    switch (indexPath.row) { 
case 3: { 
      cell.textLabel.text = @"Phone" ; 
      tf = phoneFieldTextField = [self makeTextField:self.phone placeholder:@"xxx-xxx-xxxx"]; 
      phoneFieldTextField.keyboardType = UIKeyboardTypePhonePad; 

      [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES]; 

      [cell addSubview:phoneFieldTextField]; 
      break ; 
} 
    // Textfield dimensions 
    tf.frame = CGRectMake(120, 12, 170, 30); 

    // Workaround to dismiss keyboard when Done/Return is tapped 
    [tf addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit]; 

} 
} 

// Textfield value changed, store the new value. 
- (void)textFieldDidEndEditing:(UITextField *)textField { 

//Section 1. 
if (textField == nameFieldTextField) { 
    self.name = textField.text ; 
} else if (textField == addressFieldTextField) { 
    self.address = textField.text ; 
} else if (textField == emailFieldTextField) { 
    self.email = textField.text ; 
} else if (textField == phoneFieldTextField) { 
    self.phone = textField.text ; 
}else if (textField == dateOfBirthTextField) { 
    self.dateOfBirth = textField.text ; 
} 

} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
NSString* totalString = [NSString stringWithFormat:@"%@%@",textField.text,string]; 

// if it's the phone number textfield format it. 
if(textField.tag == 10) { 
    if (range.length == 1) { 
     // Delete button was hit.. so tell the method to delete the last char. 
     textField.text = [self formatPhoneNumber:totalString deleteLastChar:YES]; 
    } else { 
     textField.text = [self formatPhoneNumber:totalString deleteLastChar:NO ]; 
    } 
    return false; 
} 

return YES; 
NSLog(@"Testing should change character in range"); 
} 

-(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar { 

if(simpleNumber.length == 0) return @""; 
// use regex to remove non-digits(including spaces) so we are left with just the numbers 
NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[\\s-\\(\\)]" options:NSRegularExpressionCaseInsensitive error:&error]; 
simpleNumber = [regex stringByReplacingMatchesInString:simpleNumber options:0 range:NSMakeRange(0, [simpleNumber length]) withTemplate:@""]; 

// check if the number is to long 
if(simpleNumber.length>10) { 
    // remove last extra chars. 
    simpleNumber = [simpleNumber substringToIndex:10]; 
} 

if(deleteLastChar) { 
    // should we delete the last digit? 
    simpleNumber = [simpleNumber substringToIndex:[simpleNumber length] - 1]; 
} 

// 123 456 7890 
// format the number.. if it's less then 7 digits.. then use this regex. 
if(simpleNumber.length<7) 
    simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d+)" 
                  withString:@"($1) $2" 
                   options:NSRegularExpressionSearch 
                   range:NSMakeRange(0, [simpleNumber length])]; 

else // else do this one.. 
    simpleNumber = [simpleNumber stringByReplacingOccurrencesOfString:@"(\\d{3})(\\d{3})(\\d+)" 
                  withString:@"($1) $2-$3" 
                   options:NSRegularExpressionSearch 
                   range:NSMakeRange(0, [simpleNumber length])]; 

if (simpleNumber.length == 10 && deleteLastChar == NO) { [self resignFirstResponder];} 

return simpleNumber; 
NSLog(@"Testing format phone number"); 
} 

#pragma mark - TextField 
-(UITextField*) makeTextField: (NSString*)text 
       placeholder: (NSString*)placeholder { 
UITextField *tf = [[UITextField alloc] init]; 
tf.placeholder = placeholder; 
tf.text = text ; 
tf.autocorrectionType = UITextAutocorrectionTypeNo ; 
tf.autocapitalizationType = UITextAutocapitalizationTypeNone; 
tf.adjustsFontSizeToFitWidth = YES; 
tf.returnKeyType = UIReturnKeyDone; 
tf.textColor = [UIColor colorWithRed:56.0f/255.0f green:84.0f/255.0f blue:135.0f/255.0f alpha:1.0f]; 
return tf ; 
} 

答えて

8

使用している方法:

-(NSString*) formatPhoneNumber:(NSString*) simpleNumber deleteLastChar:(BOOL)deleteLastChar 

は、NSStringのオブジェクトを返します。あなたの場合は、メソッドを正しく呼び出すが、返されたNSStringオブジェクトを何も設定していない。それは単にそこにぶら下がっているだけです。あなたには、いくつかのほとんどのメソッドがでているに気づいた場合

: - あなたが復帰方法について詳細を知りたい場合は、以下を読んで

phoneFieldTextField.text = [self formatPhoneNumber:phoneFieldTextField.text deleteLastChar:YES]; 

注:あなたはそうのようなフォーマットされたテキストにphoneFieldTextFieldを設定する必要がありますボイドタイプ。

- (void)someMethod { 
    int x = 10; 
} 

someMethodが何も返さないということは、何も意味しません。メソッド内でコードを実行するだけです。今すぐオブジェクトまたは他のいくつかのデータ型を返す以外の方法は次のようになります。あなたは気づくでしょう

- (int)returnSomething { 
    int x = 10; 
    return x; 
} 

まず最初は、それはintで、戻り値の型は、もはや無効ではないです。つまり、このメソッドは整数型を返します。この場合、コードが実行され、xの値が返されます。

これはリターンメソッドのトピックの始まりにすぎませんが、うまくいけば、少し明確になります。

3

まず第一に、あなたは私達があなたのアプリとすべてのコードを持っていない機能していない何私たちにを伝える必要があります。働いているものと正確に働いていないものについて説明する必要があります。あなたの質問はなぜtextField:shouldChangeCharactersInRange:が機能していないのかを理解するのに時間がかかりました。関数内でブレークポイントを設定して、何をしているのかを確認しましたか?それは呼ばれていませんでしたか?あなたのバグがtextField:shouldChangeCharactersInRange:は、テキストフィールドを識別するためにタグを使用しているが、コードの残りの部分はまた、あなたはそれで問題があるかもしれませんmakeTextField:placeholder:ためのコードが含まれていませんでしたポインタ

// if it's the phone number textfield format it. 
- if(textField.tag == 10) { 
+ if(textField.tag == phoneFieldTextField) { 

を使用していることであると述べ

あまりにも。私のサンプルのコードをmakeTextField:placeholder:と比較してください。

私はGitHubでサンプルプロジェクトを作成しました。これを修正する。私はまた、テーブルビューを使用して入力フォームを作成するためのより良いアプローチをデモします。

https://github.com/GayleDDS/TestTableViewTextField.git

は、私は物事を動作させるためにYourTableViewController.mに何をしたか確認するために、両方の差分を見てください。

https://github.com/GayleDDS/TestTableViewTextField/commit/d65a288cb4da7e1e5b05790ea23d72d472564793 https://github.com/GayleDDS/TestTableViewTextField/commit/31ecaec8c9c01204643d72d6c3ca5a4c58982099

ここでは他の問題の束があります:あなたが呼び出す必要が

  • は[スーパーのviewDidLoad];あなたのviewDidLoadメソッドで
  • コードを正しくインデントする必要があります(カットアンドペーストの問題があります)
  • ビューを作成するには、ストーリーボードを使用する必要があります。より良いソリューションタブとBetterTableViewControllerの実装を参照してください。

監視する必要があります - iOSの開発ビデオを

+0

最初に、タイトルの私の質問は正確に何が動作していないと言います。第2に、「バグ」は 'textField:shouldChangeCharactersInRange:'にはありません。なぜなら、これは私のメソッドでもないからです。下のDanaはそれをうまく動作させることができました。私はそれに応じてtextField.tagを設定しました。私はまた、呼び出されているものを記録した。私のケース3はちょうど良いと呼ばれる取得し、すべてのセルとプレースホルダの罰金と動作します。 – Jason

+0

問題は、このサイトで見つけて適切に参照している電話番号方法を使用するようにセルをフォーマットすることです。 'superView didLoad'も私の' viewDidLoad'にあります。この質問には必要ないだけです。私はあなたが提案した通りストーリーボードも使用しています。 – Jason

+1

こんにちは@Jasonは私のサンプルアプリケーションをダウンロードしてチェックアウトしましたか? [OK]をあなたのタグを設定しても、代議員を設定しましたか?上記の質問にmakeTextFieldコードを含めることもできますか?ありがとう – GayleDDS

1

あなたは.hファイルに、デリゲート<UITextFieldDelegate>を設定していないように見えます、あなたのテキストフィールドのデリゲートプロパティを自分に割り当てることはありません- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

これを試してみてください行く

-Good Luck!

1

@korayが正しかった:クラスの代理人をセットアップする必要があります。 (NSStringの*)テキストプレースホルダ::(NSStringの*)プレースホルダの方法、あなたはのようなものを持っている必要があります:あなたのクラスはUITextFieldDelegate(UITableViewDataSourceに加えて、私は仮定)

は、あなたのmakeTextFieldでプロトコルを実装するように宣言する必要があります

-(UITextField*) makeTextField: (NSString*)text 
       placeholder: (NSString*)placeholder { 
    UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(40, 0, 150, 40)]; 
    tf.placeholder = placeholder; 
    // (...) 
    tf.delegate = self; 
    return tf ; 
} 

次に、デリゲートメソッドを正しく設定する必要があります。次の例では、数値パッドに戻り値または完了ボタンがないため、ナビゲーションバーがあります。 Iセットアップ行わボタン(あなたはキーボードが行く作りの別の方法を持っていること、およびテキストフィールドの切り替えはとにかく版の終了をトリガする)として機能するボタン:次に

- (void) textFieldDidBeginEditing:(UITextField *)textField { 
    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneEditing:)]; 

    self.navBar.topItem.rightBarButtonItem = doneBtn; 
} 

- (void) doneEditing:(id) sender { 
    if(phoneFieldTextField.isFirstResponder) { 
     [phoneFieldTextField resignFirstResponder]; 
    } 
    // (...) 
    self.navBar.topItem.rightBarButtonItem = nil; 
} 

を、魔法で起こりますtextDidEndEditingデリゲートメソッド:

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    if (textField == phoneFieldTextField) { 
     self.phone = [self formatPhoneNumber:textField.text deleteLastChar:YES] ; // convert 
     [phoneFieldTextField setText:self.phone]; // display 
    } 
    // (...) 
} 
関連する問題