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