2014-10-22 5 views
1

У меня есть ViewController, который содержит серию UITextFields (формы), которые пользователи приложения заполняют и отправляют (нажав на UIButton). Данные отправляются во внешнюю базу данных (MySQL), и все это отлично работает. Однако я хочу, чтобы все UITextField были «необходимы»; другими словами, кнопка «отправить» не должна публиковать данные, если все поля не заполнены (содержат значения). Кто-нибудь знает, как я могу это сделать? См. Мой код ниже.Как я могу сделать «требуемые» UITextFields?

ViewController.h

-(IBAction)addParty:(id)sender; 

@property (strong, nonatomic) IBOutlet UITextField *firstname; 
@property (strong, nonatomic) IBOutlet UITextField *lastname; 
@property (strong, nonatomic) IBOutlet UITextField *guestphone; 
@property (strong, nonatomic) IBOutlet UITextField *guestemail; 
@property (strong, nonatomic) IBOutlet UITextField *guestsize; 

@end 

ViewController.m

- (IBAction)addParty:(id)sender 
{ 


    NSString *strURL = [NSString stringWithFormat:@"guestfirst=%@&guestlast=%@&guestphone=%@&guestemail=%@&guestsize=%@", firstname.text, lastname.text, guestphone.text, guestemail.text, guestsize.text]; 
    NSLog(@"%@", strURL); 


    NSData *postData = [strURL dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"postgl.php"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 
    [request setHTTPBody:postData]; 


    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

    if(conn) 
    { 
     NSLog(@"Connection Successful"); 

     [thankyou setHidden:NO];   
    } 
    else 
    { 
     [thankyou setHidden:YES]; 
     NSLog(@"Connection could not be made"); 
    } 

} 

ответ

-1

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

поэтому, если у вас есть 3 текстовых поля, которые необходимы, 3 вложенных оператора if сделают трюк.

+0

Большое вам спасибо; вложенные в if/else заявления - это то, что в конечном итоге работает для меня. Написал фактический код в ответе ниже, если кто-нибудь еще этого захочет :) – Brittany

+1

Зачем вам предлагать 3 вложенных оператора 'if'? Что делать, если было 20 текстовых полей? 20 вложенных операторов 'if' станут глупыми. – rmaddy

1

Одним из решений было бы установить делегат для текстовых полей как UIViewController.

Реализовать следующие в методе делегата

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; 

После того, как это реализовано, вы должны иметь метод, как следующее:

- (BOOL)enableSubmitButton 
{ 
    for (UITextField *textField in @[self.firstname, self.lastname, self.guestphone, self.guestemail, self.guestsize]) { 
     if (textfield.text.length == 0) { 
      return NO; 
     } 
    } 
    return YES; 
} 

Тогда вы должны иметь IBOutlet для кнопки набора и вы может вызвать внутри mustChangeCharactersInRange enableSubmitButton и установить кнопку, включенную для этого, т.е.

@property (nonatomic, weak) IBOutlet UIButton *submitButton; 

or could be UIBarButtonItem 

@property (nonatomic, weak) IBOutlet UIBarButtonItem *submitButton; 

self.submitButton.enabled = [self enableSubmitButton]; 
+0

Использовал часть вашего ответа с моим собственным, и это закончилось тем, что работало :) Посмотрите, что я сделал ниже (отправил ответ всем, кому это интересно). Спасибо! – Brittany

0

Вложенные в if/else заявления - это то, что в конечном итоге работает для меня (например, таким образом, если заполняются поля 3/5, данные не будут отправляться, если 5/5 не будут заполнены). Спасибо всем за вашу помощь!

- (IBAction)addParty:(id)sender 

{ 

    for (UITextField *textFielda in @[self.firstname]) { 
     if (textFielda.text.length == 0) { 

      [pleasefinish setHidden:NO]; 

     } 

     for (UITextField *textFieldb in @[self.lastname]) { 
      if (textFieldb.text.length == 0) { 

       [pleasefinish setHidden:NO]; 

      } 

     for (UITextField *textFieldc in @[self.guestphone]) { 
       if (textFieldc.text.length == 0) { 

        [pleasefinish setHidden:NO]; 

       } 

     for (UITextField *textFieldd in @[self.guestemail]) { 
        if (textFieldd.text.length == 0) { 

         [pleasefinish setHidden:NO]; 

        } 

     for (UITextField *textFielde in @[self.guestsize]) { 
         if (textFielde.text.length == 0) { 

          [pleasefinish setHidden:NO]; 

         } 

     else { 

     [pleasefinish setHidden:YES]; 

    NSString *strURL = [NSString stringWithFormat:@"guestfirst=%@&guestlast=%@&guestphone=%@&guestemail=%@&guestsize=%@", firstname.text, lastname.text, guestphone.text, guestemail.text, guestsize.text]; 
    NSLog(@"%@", strURL); 


    NSData *postData = [strURL dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"postgl.php"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 
    [request setHTTPBody:postData]; 


    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 



    if(conn) 
    { 
     NSLog(@"Connection Successful"); 

     [thankyou setHidden:NO]; 

    } 
    else 
    { 
     [thankyou setHidden:YES]; 
     NSLog(@"Connection could not be made"); 
    } 


} 
    } 

       } 


      } 
     } 
    } 
} 
+0

Извините, но это действительно уродливое решение проблемы. Нет смысла встраивать for-loops, и нет никакого смысла для цикла for, который выполняет итерацию одного значения. Представьте код, если у вас было 20 текстовых полей. Правильное решение будет выглядеть одинаково, если у вас есть 2 или 200 текстовых полей. Пожалуйста, рассмотрите использование одного цикла, как показано в ответе @ darren102. – rmaddy

+0

Привет @rmaddy! Первоначально я закончил маршрут, предложенный @ darren102, но он работал только в том случае, если поля ALL имели значение 0 (не если 3/5 поля имели значение 0)? – Brittany

+0

Простым изменением было бы держать счет в цикле. По достижении минимума вы можете вернуть 'YES'. Я не вижу, как код в вашем ответе поддерживает 3/5 и требует всех. – rmaddy

1

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

- (IBAction)addParty:(id)sender 
{ 
    NSArray *required = @[ 
          self.firstname, 
          self.lastname, 
          self.guestphone, 
          self.guestemail, 
          self.guestsize 
    ]; 

    if([[required valueForKeyPath:@"[email protected]"] intValue] == 0) 
    { 
     [pleasefinish setHidden:NO]; 
     [thankyou setHidden:YES]; 
    } 
    else 
    { 
     [pleasefinish setHidden:YES]; 
     [thankyou setHidden:NO]; 
    } 
} 
Смежные вопросы