Как хранить текст на основе тега - PullRequest
0 голосов
/ 24 сентября 2018

Как сохранить текст на основе тега.

Я использовал UITextField в UITableViewCell.

Мой viewcontroller: -

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let identifier = "Cell"
        var cell: NH_QuestionListCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell

        if cell == nil {
            tableView.register(UINib(nibName: "NH_QuestionListCell", bundle: nil), forCellReuseIdentifier: identifier)
            cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
        }
        cell.contentView.backgroundColor = UIColor.clear

        cell.textadd = {[weak self] in

                if let i = self?.tableview.indexPath(for: $0) {

                    print("the selected text\(cell.textname ?? "")")

                    print(i)

                    print("the Selected button is \(cell.textname ?? "")")

                    print(i)

                    cell.setText(Options:(self?.questionViewModel.datafordisplay(atindex: indexPath))!)                     

                    let model = self?.questionViewModel.datafordisplay(atindex: indexPath)
                    print(model?.values ?? "")

                    if model?.isSelected == true{

                     cell.texttype.tag = indexPath.row
                   //  cell.texttype.text = questionViewModel.datafordisplay(atindex: indexPath)

      }
      return cell

}

Ячейка таблицы: -

 @IBOutlet weak var texttype: UITextField!
    var textname:String?

    var textadd : ((NH_QuestionListCell) -> Void)?
    @IBAction func TextAction(_ sender: UITextField) {

         print(texttype.text)
            //    self.question.text = texttype.text

        let index = texttype.tag
        self.textname = texttype.text          

        self.textname = texttype.text
        print(self.textname)
                print(texttype.text)
             textadd?(self)
    }

    func setText(Options:NH_OptionsModel)     
    {
        self.displaySmiley.isHidden = true
        self.viewdisplay.isHidden = false
        self.imagebutton.isHidden = true
        self.question.isHidden = true
        self.displayRatingView.isHidden = true

        print(Options.values)
        Options.values = self.textname
        print(Options.values)     
    }

     func textFieldDidBeginEditing(_ textField: UITextField) {
       texttype.text = ""    
    }

    func textFieldShouldClear(_ textField: UITextField) -> Bool
    {
               return true
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
          self.TextAction(texttype)          
    }

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {         
        return true;
    }      

    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {           
        return true;       
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        print(texttype.text)

        texttype.resignFirstResponder()

        return true
    }

Я получил вывод.В первой ячейке я набрал текст в текстовом поле и нажал «Ввод».Затем я прокрутил.В то время я обнаружил, что набранный текст доступен в других ячейках.Как решить эту проблему?

1 Ответ

0 голосов
/ 24 сентября 2018

Вам не нужно использовать ячейку tag, так как вы используете закрытие для каждой ячейки для обработки обновления текстового поля;Это закрытие захватит indexPath, чтобы вы знали, какую строку вы обновляете.Единственная проблема, которая может возникнуть, - это если вы разрешите переупорядочение ячеек либо путем перемещения ячеек, либо с помощью возможности вставки / удаления ячеек.В этом случае захваченный indexPath станет недействительным (это та же проблема, что и при использовании tag).Вы можете решить эту проблему, вызвав indexPath(for:) в замыкании, чтобы получить индексный путь ячейки при выполнении замыкания.

Причина, по которой текст появляется при прокрутке, заключается в том, что объекты ячейки используются повторно иВы не устанавливаете текстовое поле явно.

Наконец, вы можете избежать всего танца weak self, так как когда контроллер представления освобождается, представление таблицы будет освобождено, что означает, что ячейки будут освобождены.У вас нет цикла сохранения, хотя используется замыкание.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let identifier = "Cell"
        var cell: NH_QuestionListCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell

        if cell == nil {
            tableView.register(UINib(nibName: "NH_QuestionListCell", bundle: nil), forCellReuseIdentifier: identifier)
            cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
        }
        cell.contentView.backgroundColor = UIColor.clear
        cell.setText(options: self.questionViewModel.datafordisplay(atindex: indexPath))

        cell.textadd = {

                self.questionViewModel.setData(atIndex: indexPath,text: cell.textName)
        }
      return cell

}

Обратите внимание, вы не предоставили подробную информацию о том, как должен обновляться объект вашей модели, поэтому я вставил вызов функции, чтобы показатьidea.

Я бы также предложил вам ознакомиться с конвенциями Swift.Использование заглавных букв для имен параметров и использование NH_ в качестве префикса класса не является «Swifty»

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