Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift中保存文本字段中的文本?_Ios_Uitextfield_Swift4 - Fatal编程技术网

Ios 如何在swift中保存文本字段中的文本?

Ios 如何在swift中保存文本字段中的文本?,ios,uitextfield,swift4,Ios,Uitextfield,Swift4,我有一个由2个单元格组成的tableview,每个单元格都有一个textfield。我想将textfield中的文本保存在另一个变量中,并将其附加到数组中,但它只将第二个单元格的textfield的文本保存到变量中,而不附加数组 以下是cellForRowAt代码: func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if tableView ==

我有一个由2个单元格组成的tableview,每个单元格都有一个textfield。我想将textfield中的文本保存在另一个变量中,并将其附加到数组中,但它只将第二个单元格的textfield的文本保存到变量中,而不附加数组

以下是cellForRowAt代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView == queryTableView {
            let cell = tableView.dequeueReusableCell(withIdentifier: queryCellReuseIdentifier,
                                                   for: indexPath) as! queryCell

            cell.selectionStyle = UITableViewCell.SelectionStyle.gray

            queryTextField = UITextField(frame: CGRect(x: 20, y: 0, width: 300, height: 20))
            queryTextField.delegate = self
            queryTextField.placeholder = "Soruyu buraya giriniz"
            queryTextField.font = UIFont.systemFont(ofSize: 15)
            cell.addSubview(queryTextField)

            return cell

        }
以下是我的相关功能:


  func textFieldDidEndEditing(_ textField: UITextField) {
        var temp = queryTextField.text!
        queryArray.append(temp)

        print(temp)

    }

似乎您有一个独立变量
querytexfield
,当您创建第二个单元格时,它会被覆盖

另外,在
textfielddendediting
中,尝试访问
textField
而不是
queryTextField
,如下所示:

func textFieldDidEndEditing(_ textField: UITextField) {
     var temp = textField.text!
     queryArray.append(temp)

     print(temp)
}
对此作出回应:

我需要每个单元格都有它的文本字段,我需要能够保存 它们的文本组成一个数组。之后,我将把它们发送到web 服务总之,它们将是我的参数

  • 您不需要仅为此设置全局
    queryTextField
    。如果这是变量的唯一目标,则可以删除该变量
  • 您是否需要在某些触发器上发送web请求?像按钮点击。我想是的
  • 从理论上讲,并非所有单元格都同时可见(例如,当它们不适合屏幕时),尝试在文本字段中跟踪文本是个坏主意。相反,您需要某种模型来存储所有文本(可能与索引配对)。最简单的是字典,其中键是单元格标识符(例如
    indepath
    ),值是文本
  • textfielddidediting
    中,可以向视图控制器报告更改。为此,需要将单元格指定为其文本字段的委托。和视图控制器-作为单元格的委托。在
    textfielddidediting
    中,单元格将调用视图控制器委托方法来报告文本更改,并将self和文本作为参数传递(例如)。视图控制器将能够找到其索引路径并将文本存储在模型(字典)中
  • 在触发(按钮点击?)时,视图控制器将能够从模型(字典)构建参数
  • 将此伪代码视为一个方向:

    cellForRow {
      ...
      cell = ...
      let textField = ...
      textField.delegate = cell
      cell.addSubview(textField)
      cell.delegate = self
    }
    
    单元内:

    textFieldDidEndEditing(textField: UITextField) {
      delegate?.report(text: textField.text ?? "", in: self)
    }
    
    视图控制器:

    report(text: String, in cell: UITableViewCell) {
      let indexPath = tableView.indexPath(of: cell)
      model[indexPath] = text
    }
    

    如果您的项目是非故事板方法,那么我会说,控制每种类型、数据和操作将更容易、更灵活,因为有时仅使用故事板并不十分灵活。在创建时,即使是单个UIElement,UI也符合您定义的属性、方法和操作,这意味着完全自定义的代码-自定义定义的代码库

    现在来回答您的问题,根据您所做的,您的textfield文本可能会被覆盖为空白,每次单元格出列时都会丢失以前输入的值,每次执行“出列单元格”方法时都会重新生成单元格以供使用,如果您想保留以前的值,我会说,“提醒退出队列的单元格在再次退出队列之前它有一些值”表示:

  • 声明您的全局数组或dict
  • 将单元格出列并设置单元格属性 3在单元格出列后,执行类似操作,即使在单元格出列后,您的单元格上一个值也会被保存
  • 例如,通用方法:

    struct DefaultInfo {
         var string: String?
         var type: SomeData? //optional
    }
    
     let array: [DefaultInfo] = []
      
     var array = self.array[indexPath.row]
    
     // after cell is dequeued:
     switch array.type {
            case .someCase:
              
              let string = cell.textField.text
              array.string = string
              cell.textField.text = array.string
              //print(array.string!)
              // now you should be able to see your input after cell is 
              //renewed.. . try it.. .
            
           default: break
      }
    

    我已将queryTextField定义为全局:
    var queryTextField=UITextField()
    @evgeni,你每次都在
    cellForRowAt
    中覆盖它。那么,拥有它有什么意义呢?现在,我感觉到了我的错误,但仍然无法找出正确的方法。因为这是一个非常大的项目,有数千行代码。什么是最有效的方法?@evgeniy取决于你想做什么。我给了你我的答案中有u个示例代码。这不是你要找的吗?如果不是,那是什么?也许我没有正确理解你的问题?我是一个不使用故事板创建界面的新手。我需要每个单元格都有它的文本字段,我需要能够将它们的文本保存到数组中。然后我将它们发送到web服务。总之,t“嘿,这将是我的参数。”叶甫盖尼说