Swift:用于检测用户编辑的热点已停止在UITextView

时间:2015-09-17 14:16:39

标签: ios swift uitextview uitextviewdelegate

我有一个表视图,其中两个单元格具有UITextView,用户可以在其中输入长数据。在Stackoverflow中的一些答案之后,我实现了一个协议/委托,以检测用户何时完成输入数据,然后将其保存在全局字典中:

class DetailsNewTaskViewController: UITableViewController, TextViewCellDelegate {

var cellData:[String:String] = [:]

 func controllerView(controller: UITableViewCell, textViewDidEndEditing: String, atIndex:Int) {

        switch(atIndex) {
            case 0:
                self.cellData["titolo"] = (controller as! LittleTextCell).textView.text
                break
            case 1:
                self.cellData["oggetto"] = (controller as! BigTextCell).textView.text
                break
            default:
                break
        }
 }

这是相对自定义单元格类:

class LittleTextCell: UITableViewCell, UITextViewDelegate {
  @IBOutlet weak var label : UILabel!
  @IBOutlet weak var textView : UITextView!
  var delegate:TextViewCellDelegate?
  var rowIndex:Int?

  func textViewDidEndEditing(textView: UITextView) {
    delegate?.controllerView(self, textViewDidEndEditing: textView.text, atIndex: rowIndex!)
  }
}

其中textView的委托是类本身。

这是该应用程序的屏幕截图: enter image description here

“问题”是只有在用户点击另一个单元格/字段之后,文本才会存储在全局字典中。如果用户在完成输入文本后点击“精确”按钮(保存数据)而没有触及另一个字段,该怎么办?这是一个致命的零错误。所以我想知道是否有一种方法来检测用户是否已经停止输入,即使他仍然在该单元格内,以便始终存储内容。 可能吗?有没有特定的方法来实现?

更新:与“精细”按钮关联的功能:

func saveTask(sender:UIButton!) {

    self.dateFormatter.dateFormat = "yyyy-MM-dd"

    var taskToSave = Task(id: -1,
                          titolo: self.cellData["titolo"]!,
                          oggetto: self.cellData["oggetto"]!,
                          check_mail: self.cellData["check_mail"]!.toBool()!,
                          id_progetto: self.projects[self.cellData["progetto_nome"]!]!.id,
                          progetto_nome: nil,
                          assegnato_a: nil,
                          id_assegnato_a: self.users[self.cellData["assegnato_a"]!]!.id,
                          richiesto_da: nil,
                          id_richiesto_da: self.users[self.cellData["richiesto_da"]!]!.id,
                          priorita: self.cellData["priorita"]!,
                          termine_consegna: self.dateFormatter.dateFromString(self.cellData["termine_consegna"]!)!,
                          stato: self.cellData["stato"]!)

      self.taskService.addTaskService(taskToSave) {
        (response: String) in

        if ((response.rangeOfString("Could not connect to the server.")) != nil) {
            dispatch_async(dispatch_get_main_queue()) {
                self.alertView.title = "Operazione fallita!"
                self.alertView.message = "Impossibile connettersi al server. \n Riprovare."
                self.alertView.delegate = self
                self.alertView.addButtonWithTitle("OK")
                self.alertView.show()
            }
            println(response)
        }

        else {
            if ((response.rangeOfString("status code: 200")) != nil) {
                dispatch_async(dispatch_get_main_queue()) {
                    self.alertView.title = "Operazione eseguita!"
                    self.alertView.message = "Task creato correttamente"
                    self.alertView.delegate = self
                    self.alertView.addButtonWithTitle("OK")
                    self.alertView.show()

                    self.navigationController?.popViewControllerAnimated(true)
                }
            }

            else {
                println(response)
            }

        }
    }
}

2 个答案:

答案 0 :(得分:1)

只需在控制器中的方法中使用此行

self._tableView.superview?.endEditing(true);

我遇到了同样的问题,我在单元格中的文本字段,我想检查控制器中的所有字段。当我得到我的数据,所以最后的数据不是最新的,因为在最后的数据后,我点击按钮不在文本字段。所以我找到了解决方案。在我获取字典之前,我在我的方法中写了这一行(在你的情况下,这行应该是精细的方法),之后我更新了数据。 感谢

答案 1 :(得分:1)

定义全局<PID>

selectedIndexPath

将其设置为选定的indexPath

var selectedIndexPath:Int = 0

在saveTask函数中,使用cellForRowAtIndexPath获取单元格

 func controllerView(controller: UITableViewCell, textViewDidEndEditing: String, atIndex:Int) {
        selectedIndexPath = indexPath
        switch(atIndex) {
            case 0:
                self.cellData["titolo"] = (controller as! LittleTextCell).textView.text
                break
            case 1:
                self.cellData["oggetto"] = (controller as! BigTextCell).textView.text
                break
            default:
                break
        }
 }