表视图单元格中的文本字段

时间:2016-06-28 12:46:49

标签: ios swift uitableview uitextfield

我正在开发这个应用程序,我是Swift的新手。只有两周的知识。我应该创建一个包含12个单元格的表视图 - 其中3个应该是文本字段,用户可以键入他们想要的内容。我制作了两个带有两个不同标识符的原型单元格。我正在使用一个名为" items"其中包含要在单元格中表示的字符串。如果字符串是空白的,那么该单元格应该是一个文本字段,我已经完成了。之后当我尝试输入这些字段并滚动单元格时出现问题。

请帮助我理解并解决以下问题:

  1. 如何将我添加为子视图的文本字段委托给我的tableview单元格?
  2. 即使我按照自己的意愿上下滚动单元格,我怎样才能确保在文本字段中输入的内容仍然存在?
  3. 如何确保用户可以编辑他们在文本字段中输入的内容?
  4. 这是我的代码:

        var items = ["Apple", "Fish", "Dates", "Cereal", "Ice cream", "Lamb", "Potatoes", "Chicken", "Bread", " ", " "," "]
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        var iD = "normal"
        if (items[indexPath.row] == " ") {
            iD = "textField"
            let cell = tableView.dequeueReusableCellWithIdentifier(iD, forIndexPath: indexPath)
            cell.textLabel?.text = items[indexPath.row]
    
            let textField = UITextField(frame: CGRect(x: 20, y: 10, width: 150, height: 30))
            textField.backgroundColor = UIColor.brownColor()
            textField.placeholder = ""         
            cell.contentView.addSubview(textField)
            return cell      
        }
        else {
            let cell = tableView.dequeueReusableCellWithIdentifier(iD, forIndexPath: indexPath)
            cell.textLabel?.text = items[indexPath.row]
            return cell  
        }
    

    ////

        func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
        if (sourceIndexPath.row != destinationIndexPath.row){
            let temp = items[sourceIndexPath.row]
            items.removeAtIndex(sourceIndexPath.row)
            items.insert(temp, atIndex: destinationIndexPath.row)
    
        }
        tableView.reloadData()
    }
    

5 个答案:

答案 0 :(得分:1)

我宁愿创建一个UITableviewCell的子类,并在那里添加一个文本域作为子视图。然后将textfield的委托设置为单元格本身。 这是一些示例代码。我没有尝试运行它,但我认为它应该工作:

class InputCell: UITableViewCell, UITextFieldDelegate {

private let textField = UITextField()
private var resultBlock: ((changedText: String) -> ())? = nil

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.textField.delegate = self
    self.contentView.addSubview(self.textField)
    // additional setup for the textfield like setting the textstyle and so on
}

func setup(initalText: String, resultBlock: (changedText: String) -> ()) {
    self.textField.text = initalText
    self.resultBlock = resultBlock
}

func textFieldDidEndEditing(textField: UITextField) {
    if let block = self.resultBlock, let text = textField.text {
        block(changedText: text)
    }
}
}

在视图控制器中,我会将项目更改为字典,因此您可以直接将它们链接到tableview的索引路径。你需要让tableview注册你的自定义单元类。

var items = [0: "Apple", 1: "Fish", 2: "Dates", 3: "Cereal", 4: "Ice cream", 5: "Lamb", 6: "Potatoes", 7: "Chicken", 8: "Bread", 9: " ", 10: " ", 11: " "]

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // the position of the cell with a textfield is fixed right? Just put the row number here then
    if indexPath.row > 8 {
        let cell = tableView.dequeueReusableCellWithIdentifier("CellWithTextField", forIndexPath: indexPath) as! InputCell
        if let initialText = items[indexPath.row] {
            cell.setup(initialText) { [weak self] text in
                self?.items[indexPath.row] = text
            }
        }
        return cell
    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier("NormalCell", forIndexPath: indexPath)
        cell.textLabel?.text = items[indexPath.row]
        return cell
    }
}

答案 1 :(得分:0)

首先,添加文本域协议UITextFielDelegate,并在单元格中为row atindex写textfield.delegate = self。

并添加委托方法来管理文本。

希望这对你有所帮助。

答案 2 :(得分:0)

将UITextFieldDelegate继承到您的控制器

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

var iD = "normal"
if (items[indexPath.row] == " ") {
    iD = "textField"
    let cell = tableView.dequeueReusableCellWithIdentifier(iD, forIndexPath: indexPath)
    cell.textLabel?.text = items[indexPath.row]

    let textField = UITextField(frame: CGRect(x: 20, y: 10, width: 150, height: 30))
    textField.backgroundColor = UIColor.brownColor()
    textField.placeholder = ""         
    cell.contentView.addSubview(textField)
    textField.delegate = self // set delegate
    textField.tag= indexPath.row
    return cell      
}
else {
    let cell = tableView.dequeueReusableCellWithIdentifier(iD, forIndexPath: indexPath)
    cell.textLabel?.text = items[indexPath.row]
    return cell  
  }
}

 //delegate methods

 func textFieldDidBeginEditing(textField: UITextField!) {      //delegate method
  print(textField.tag)//you will get the row. items[textField.tag] will get the object

 }
 func textFieldShouldEndEditing(textField: UITextField!) -> Bool {   //delegate method
  print(textField.tag)//you will get the row. items[textField.tag] will get the object
  items[textField.tag]= textField.text
  return false
}

 func textFieldShouldReturn(textField: UITextField!) -> Bool {     //delegate method
   textField.resignFirstResponder()
   return true
 }

答案 3 :(得分:0)

您必须将文本字段数据保存在某个对象中。当UITableView重用相同的单元格时,文本字段文本将在滚动时丢失,因为单元格将被重用。我建议创建一些数组并将数据存储在每个indexPath中。

您应该在单元类中实现UITextField委托方法,并且每当某些文本发生更改时,您应该调用您的另一个委托方法(CellDelegate),该方法应该在ViewController中实现以更新数据。

此委托方法将传递单元格的text和indexPath。

答案 4 :(得分:0)

在UITableViewCell中为textChange添加UItextfield委托。 您可以更改items数组以包含具有实际值和编辑值的模型对象。

let apple = Item()
apple.realValue = "Apple"
apple.editedValue = ""

var item = [0: apple, .............

在tableview单元格中传递模型对象,并在文本更改委托调用上更新已编辑的值。在cellForRow中,在textfield文本属性中添加editedValue

let item = items[indexPath.row]
cell.textLabel?.text = item.realValue
if item.editedValue{
// add the textFieldText

}