2016-04-01 6 views
0

私のコードで私のメソッドのformatPhoneNumber/textFieldメソッドを持っていると、他のフィールドに入力することができません。私がそれらを削除すると、問題はなくなります。誰かがこの問題の原因となっている私のコードに間違っていることを教えてもらえますか?Regexの電話番号メソッドがテキストフィールドを壊す

//------------------------------------------------------------------------------------------------------------------------------------------------- 
@interface RegisterView() 

@property (strong, nonatomic) IBOutlet UITableViewCell *cellName; 
@property (strong, nonatomic) IBOutlet UITableViewCell *cellEmail; 
@property (strong, nonatomic) IBOutlet UITableViewCell *cellPassword; 
@property (strong, nonatomic) IBOutlet UITableViewCell *cellButton; 
@property (strong, nonatomic) IBOutlet UITableViewCell *cellPhone; 
@property (strong, nonatomic) IBOutlet UITableViewCell *cellFName; 
@property (strong, nonatomic) IBOutlet UITableViewCell *cellLName; 
@property (strong, nonatomic) IBOutlet UITextField  *fieldName; 
@property (strong, nonatomic) IBOutlet UITextField  *fieldEmail; 
@property (strong, nonatomic) IBOutlet UITextField  *fieldPassword; 
@property (strong, nonatomic) IBOutlet UITextField  *fieldPhone; 
@property (strong, nonatomic) IBOutlet UITextField  *fieldFName; 
@property (strong, nonatomic) IBOutlet UITextField  *fieldLName; 

@end 
//------------------------------------------------------------------------------------------------------------------------------------------------- 

@implementation RegisterView 

@synthesize cellName, cellEmail, cellPassword, cellButton, cellPhone, cellLName, cellFName; 
@synthesize fieldName, fieldEmail, fieldPassword, fieldPhone, fieldLName,fieldFName; 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (void)viewDidLoad 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    [super viewDidLoad]; 
    self.title = @"Register"; 

    //UIColor *background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"giberWallpaper.png"]]; 
    //self.tableView.backgroundColor = background; 

    self.navigationController.navigationBar.tintColor= [UIColor colorWithRed:(255/256.0) green:(128/256.0) blue:(0/256.0) alpha:(1.0)]; 
    //--------------------------------------------------------------------------------------------------------------------------------------------- 
    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
    [self.tableView addGestureRecognizer:gestureRecognizer]; 
    gestureRecognizer.cancelsTouchesInView = NO; 
} 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (void)viewDidAppear:(BOOL)animated 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    [super viewDidAppear:animated]; 
    [fieldName becomeFirstResponder]; 
} 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (void)dismissKeyboard 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    [self.view endEditing:YES]; 
} 

#pragma mark - User actions 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (void)actionRegister 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    NSString *name  = fieldName.text; 
    NSString *email  = [fieldEmail.text lowercaseString]; 
    NSString *password = fieldPassword.text; 
    NSString *phoneNumber= fieldPhone.text; 
    NSString *fName  = fieldFName.text; 
    NSString *lName  = fieldLName.text; 
    NSString *fullName = [NSString stringWithFormat: @"%@ %@", fName, lName]; 
    //--------------------------------------------------------------------------------------------------------------------------------------------- 
    if ([name length] < 3)   { [ProgressHUD showError:@"Name is too short."]; return; } 
    if ([email length] == 0)  { [ProgressHUD showError:@"Email must be set."]; return; } 
    if ([password length] == 0)  { [ProgressHUD showError:@"Password must be set."]; return; } 
    if ([phoneNumber length] == 0) { [ProgressHUD showError:@"Phone number must be set."]; return; } 
    if ([lName length] < 2)   { [ProgressHUD showError:@"Name is too short."]; return; } 
    if ([fName length] < 2)   { [ProgressHUD showError:@"Name is too short."]; return; } 
    //--------------------------------------------------------------------------------------------------------------------------------------------- 
    [ProgressHUD show:@"Please wait..." Interaction:NO]; 
    //--------------------------------------------------------------------------------------------------------------------------------------------- 
    PFUser *user = [PFUser user]; 
    user.email = email; 
    user.username = email; 
    user.password = password; 
    int randInt = arc4random() % 9000 + 1000; 
    NSString *strInt = [NSString stringWithFormat:@"%d",randInt]; 
    user[PF_USER_PIN]   = strInt; 
    user[PF_USER_NICKNAME]  = name; 
    user[PF_USER_FIRSTNAME]  = fName; 
    user[PF_USER_LASTNAME]  = lName; 
    user[PF_USER_PHONENUMBER] = phoneNumber; 
    user[PF_USER_EMAILCOPY]  = email; 
    user[PF_USER_FULLNAME]  = fullName; 
    user[PF_USER_FULLNAME_LOWER] = [fullName lowercaseString]; 

    [user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) 
    { 
     if (error == nil) 
     { 
      ParsePushUserAssign(); 
      PostNotification(NOTIFICATION_USER_LOGGED_IN); 
      [ProgressHUD showSuccess:@"Succeed."]; 
      [self dismissViewControllerAnimated:YES completion:nil]; 
     } 
     else [ProgressHUD showError:error.userInfo[@"error"]]; 
    }]; 
} 

-(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])]; 
    return simpleNumber; 
} 
- (BOOL)textField:(UITextField *)fieldPhone shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString* totalString = [NSString stringWithFormat:@"%@%@",self.fieldPhone.text,string]; 

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

    return YES; 
} 
#pragma mark - Table view data source 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    return 1; 
} 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    return 7; 
} 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    if (indexPath.row == 0) return cellName; 
    if (indexPath.row == 1) return cellFName; 
    if (indexPath.row == 2) return cellLName; 
    if (indexPath.row == 3) return cellPhone; 
    if (indexPath.row == 4) return cellEmail; 
    if (indexPath.row == 5) return cellPassword; 
    if (indexPath.row == 6) return cellButton; 
    return nil; 
} 

#pragma mark - Table view delegate 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    //--------------------------------------------------------------------------------------------------------------------------------------------- 
    if (indexPath.row == 6) [self actionRegister]; 
} 

#pragma mark - UITextField delegate 

//------------------------------------------------------------------------------------------------------------------------------------------------- 
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
//------------------------------------------------------------------------------------------------------------------------------------------------- 
{ 
    if (textField == fieldName) 
    { 
     [fieldFName becomeFirstResponder]; 
    } 
    if (textField == fieldFName) 
    { 
     [fieldLName becomeFirstResponder]; 
    } 

    if (textField == fieldLName) 
    { 
     [fieldPhone becomeFirstResponder]; 
    } 

    if (textField == fieldPhone) 
    { 
     [fieldEmail becomeFirstResponder]; 
    } 
    if (textField == fieldEmail) 
    { 
     [fieldPassword becomeFirstResponder]; 
    } 
    if (textField == fieldPassword) 
    { 
     [self actionRegister]; 
    } 
    return YES; 
} 

@end 
+0

テキストフィールドを変更したときに、Interface Builderの元のフィールドからアウトレットを削除しましたか?それは簡単なことですが、私は過去に間違いを犯しましたので、私は尋ねると思っていました。 – fsb

+0

うん、それは正しいようです。各セルの参照コンセントは、.mの属性に対応しています –

+0

変更したテキストフィールドはどうなりますか?テキストフィールドを.mファイルに最初に接続してから別のテキストフィールドに変更したと仮定して正しいですか?その場合、その接続は古いテキストフィールドにまだ存在し、IBで削除する必要があります。 – fsb

答えて

0

あなたshouldChangeCharactersInRange:方法でtextFieldに変更fieldPhone、それはUITextFieldのfieldPhoneの最寄りの宣言と矛盾です。

また、そのメソッド内のすべての参照を新しいtextFieldに更新する必要があります。したがって、新しい方法は次のようになります: - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

+0

これを行うと問題は、私の入力フィールドは、正しく動作しない(これは、この1つのテキストフィールドにのみデータを入力することができます)。 –

+0

私はその部分を理解していません。このメソッドはすべてのテキストフィールドで呼び出され、その名前が何であるかは関係ありません。実際には、同じ名前のテキストフィールドを持っている場合にのみ重要です。名前を変更した場合でも、必要な「タグ」を参照することはできます。 – fsb

関連する問題