Как включить UITableView, когда в текстовом поле есть текст - PullRequest
1 голос
/ 11 июня 2019

У меня есть два textFields и TableView.Tableview должен быть изначально отключен (то есть labels неактивен, а cells не активируется).Когда оба значения textFields имеют значения, я хочу, чтобы TableView и tableViewCells были активными, а не серыми.До сих пор я добавил цели к обоим textfields, чтобы отслеживать, когда пользователь редактирует:

var isUserEditing: Bool = false

func setup() {
        mealItemTextField.addTarget(self, action: #selector(userIsEditing), for: UIControl.Event.editingChanged)
        priceTextField.addTarget(self, action: #selector(userIsEditing), for: UIControl.Event.editingChanged)
    }

@objc func userIsEditing(sender: UITextField) {
        sender.text = sender.text?.trimmingCharacters(in: .whitespaces)
        guard
            let mealtext = mealItemTextField.text, !mealtext.isEmpty,
            let pricetext = priceTextField.text, !pricetext.isEmpty
        else
        {
            isUserEditing = false
            return
        }
        isUserEditing = true
    }

Затем я создал расширение для UITableViewCell, которое в основном «включает» и «отключает»tableView (извлечено из этого потока):

  extension UITableViewCell {
    func enable(on: Bool) {
        for view in contentView.subviews {
            view.isUserInteractionEnabled = on
            view.alpha = on ? 1 : 0.5
        }
    }
}

Наконец, я реализовал этот метод, а также переменную isUserEditing в моем viewForHeaderInSection:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let userModel = Data.userModels[section]
    let cell = tableView.dequeueReusableCell(withIdentifier: "nameCell") as! NameHeaderTableViewCell
    cell.setup(model: userModel)
    cell.enable(on: false)
    if isUserEditing == true {
        cell.enable(on: true)
    }
    return cell.contentView
}

* * * * * * * * * * * * * * * tableView появляется "отключенным" при загрузке представления, однако, когда я начинаю вводить один или оба из textFields, он остается отключенным.Очевидно, что viewForHeaderInSection не перезагружается или не выполняется снова.

Есть ли способ добиться этого?Можно ли запустить viewForHeaderInSection в режиме реального времени и автоматически обновлять?Спасибо за любую помощь, спасибо!

Это должен быть начальный вид, когда в textField нет текста

Это должен быть вид после того, как естьнекоторый текст в обоих текстовых полях

Ответы [ 2 ]

5 голосов
/ 11 июня 2019

tableView.reloadData () отсутствует из-за того, что табличное представление не перезагружается.

@objc func userIsEditing(sender: UITextField) {
       sender.text = sender.text?.trimmingCharacters(in: .whitespaces)
       guard
           let mealtext = mealItemTextField.text, !mealtext.isEmpty,
           let pricetext = priceTextField.text, !pricetext.isEmpty
       else
       {
           isUserEditing = false
       tableView.reloadData() // reload table view here
           return
       }
       isUserEditing = true
    tableView.reloadData() // reload table view here
   }
1 голос
/ 11 июня 2019

Если вы хотите, чтобы ваш tableView отображался как клавиатура, а текстовые поля пусты или нет, вы можете проверить это с помощью уведомлений;

в вашем классе ViewController:

        override func viewDidLoad() {
             super.viewDidLoad()
             yourTableView.isUserInteractionEnabled = false

         // check notifications if keyboard shown or not
            NotificationCenter.default.addObserver(self, selector: #selector(showKeyboard), name: UIResponder.keyboardWillShowNotification, object: nil)     
            NotificationCenter.default.addObserver(self, selector: #selector(hideKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil)

         // if your textFields out of your tableview
              yourTextField1.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
                yourTextField2.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

                }


 @objc func textFieldDidChange(textField: UITextField){

     self.yourTableView.isUserInteractionEnabled = true
     print("Text changed")

  }

  // show keyboard function
  @objc func showKeyboard(notification: NSNotification){

  // You can disable your tableview or your cells in this case i just disable tableview.

     yourTableView.isUserInteractionEnabled = true
     print("keyboard appeared")
   }

   // this part is up to how you want to implement. If you want to keep tableview active after textField edited don't use this method

  @objc func hideKeyboard(notification: NSNotification){

   // You can disable your tableview or your cells
      yourTableView.isUserInteractionEnabled = false
      print("keyboard disappeared")
   }

   func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   let userModel = Data.userModels[section]
   let cell = tableView.dequeueReusableCell(withIdentifier: "nameCell") as! NameHeaderTableViewCell

        // if your text Fields inside tableView tracking you textfield changes (in this case you couldn't disable tableView initially) 

   cell.yourTextField1.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
   cell.yourTextField2.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
                return cell.contentView
   }

Я надеюсь, что это решит вашу проблему, удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...