2015-11-01 2 views
0

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

  1. Действие листов всплывает и опция сливают, которая вызывает окно предупреждения
  2. TextField в окне предупреждения просит назвать колоду
  3. Имя вводится , «OK» используется, и segue выводит пользователя на следующий экран.
  4. Если текстовое поле пуст, выведите еще одно окно с предупреждением о том, чтобы ввести правильное имя.

Теперь я хотел проверить, было ли это текстовое поле в поле оповещения пустым или нет, поэтому в мою функцию showAlertTapped была добавлена ​​контрольная переменная, чтобы проверить, пустое это поле или нет. Использовал оператор if либо для segue, либо для всплывающего окна второго предупреждения. Моя проблема заключается в том, что появляется второе поле предупреждения с просьбой ввести допустимое имя, пустое или нет. Я попытался изменить некоторые вещи вокруг, такие как начальная переменная проверки bool, а также переключение textField.text == "" в textField.text == ноль, но все, что было сделано, повторялось оба раза без отображения окна предупреждения. Пара других вещей, которые я пробовала, у меня перевернулась, но конечный результат всегда был один и тот же: либо переигрывать оба раза, либо второй предупреждающий ящик в оба раза. Так что я застрял. Я собираюсь опубликовать код, чтобы было легче увидеть, полностью ли я чего-то не хватает, и заранее извиняюсь, если мое форматирование отключено для этого сообщения, или если мой код не такой аккуратный, как должен быть. Я все еще новичок и учился, когда я ухожу. Поэтому, если у меня что-то неаккуратное или неправильное форматирование, я бы хотел его исправить. Спасибо за ваше время.

func showAlertTapped() { 
    var check = true 

    //Create the AlertController 
    let firstAlert: UIAlertController = UIAlertController(title: "New questions deck", message: "Enter a name for your questions deck", preferredStyle: .Alert) 

    //Create and add the Cancel action 
    let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in 

    } 
    firstAlert.addAction(cancelAction) 

    let saveAction: UIAlertAction = UIAlertAction(title: "Save", style: .Default) { action -> Void in 

     if check == true { 
      self.shouldPerformSegueWithIdentifier("saveSegue",sender: self) 


     } 

     else{ 

      let alert: UIAlertController = UIAlertController(title: nil, message: "Please enter a valid name", preferredStyle: .Alert) 

      alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { (action) -> Void in 
       self.dismissViewControllerAnimated(true, completion: nil) 
      })) 



      //Present the AlertController 
      self.presentViewController(alert, animated: true, completion: nil) 
     } 



    } 
    firstAlert.addAction(saveAction) 

    //Add a text field 
    firstAlert.addTextFieldWithConfigurationHandler { textField -> Void in 
     if textField.text == "" { 
      check = false 
     } 

    textField.textColor = UIColor.blueColor() 



    } 

    //Present the AlertController 
    self.presentViewController(firstAlert, animated: true, completion: nil) 

} 
+1

Вместо того, чтобы отвечать на ваш вопрос, я собираюсь предложить вам изменения в потоке пользовательского интерфейса - появление модального оповещения раздражает - пользователь должен нажать, чтобы подтвердить его, а затем, поскольку вы не можете предотвратить отклонение UIAlertController, он будет затем нужно перерисовать. Хотя это немного больше работы, вы должны создать свой собственный контроллер представления для управления модальным диалогом, который собирает имя; это дает вам гораздо лучший контроль над пользовательским интерфейсом, и вы можете просто отключить кнопку «ОК», пока текстовое поле не будет иметь контент, используя делегат текстового поля. – Paulw11

ответ

0

Независимо от дизайна, просто сделать код работы:

Проблема:

if textField.text == "" { 
     check = false 
} 

Этот код не будет работать так, как вы ожидали, блок будет называться перед его отображением не вызывается, когда текстовое поле изменилось. см. this document.

Так, чтобы исправить это, вы можете просто проверить, пуст ли текстовое поле, когда пользователь нажимает кнопку Сохранить:

let saveAction: UIAlertAction = UIAlertAction(title: "Save", style: .Default) { action -> Void in 
    let text = (firstAlert.textFields?[0] as UITextField).text 
    if text != nil && text!.characters.count>0 { 
     self.performSegueWithIdentifier("saveSegue",sender: self) 
    } 
    ....other codes.... 
} 

Я не проверить код, надеюсь, он будет работать. Если есть какие-либо ошибки, отправьте комментарий.

+0

Привет, zp_x. Благодарим вас за ответ. Поэтому я следил за кодом, и когда текстовое поле пуст, оно всплывает окно предупреждения, как я хотел, но когда я добавляю туда некоторые символы и нажимаю «Сохранить», ничего не происходит. Segue не идет. Какие-либо предложения? – ACerts

+0

Получил его на работу. Я отключил wasPerformSegueWithIdentifier с помощью функции performSegueWithIdentifier. Это правильная вещь? – ACerts

+0

@aCertos ya, вы правы, shouldPerformSegueWithIdentifier вызывается перед выполнением перехода. – Surely