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

Posted

技术标签:

【中文标题】Swift:检测用户编辑的热点已在 UITextView 中停止【英文标题】:Swift: hot to detect editing by user has stopped in a UITextView 【发布时间】:2015-09-17 14:16:39 【问题描述】:

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

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 的委托是类本身。

这是应用程序的屏幕截图:

“问题”是只有在用户点击另一个单元格/字段之后,文本才会存储在全局字典中。如果用户在完成输入文本后没有触摸另一个字段就点击“Fine”按钮(保存数据)怎么办?引发了致命的 nil 错误。因此,我想知道是否有一种方法可以检测到用户已停止输入,即使他仍在该单元格内,以便始终存储内容。 是否可以?有具体的实现方法吗?

UPDATE:与“Fine”按钮相关的功能:

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)
            

        
    

【问题讨论】:

您可以在用户按下“fine”按钮时手动设置字典数据 是的,我曾想过,但是...我怎样才能在该方法中获取单元格? 你可以用tableView:cellForRowAtIndexPath(tag)得到它,它返回单元格 好的,所以我之前需要为每个单元格分配一个标签,对吧?到目前为止我还没有使用标签... tag 可以是 indexPath 这里,你能分享一下你的精细按钮点击功能吗? 【参考方案1】:

定义全局selectedIndexPath

var selectedIndexPath:Int = 0

将其设置为选定的 indexPath

 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
        
 

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

 func saveTask(sender:UIButton!) 

        let cell = tableView.cellForRowAtIndexPath(selectedIndexPath)
        self.cellData["titolo"] = cell.LittleTextCell.textView.text
        self.cellData["oggetto"] = cell.BigTextCell.textView.text
  

【讨论】:

附言。 selectedIndexPath = indexPath 应该是用户开始编辑文本时确定 衷心感谢您!我会在完成代码重构后立即尝试!【参考方案2】:

只需在控制器中的方法中使用顶部的这一行

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

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

【讨论】:

谢谢你,伙计,你真是太好了!我真的希望就这么简单......我会在完成代码重构后立即尝试! 好的。如果它不起作用,请在此处回复我。谢谢(Y)

以上是关于Swift:检测用户编辑的热点已在 UITextView 中停止的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Auth 和 Swift:检查电子邮件是不是已在数据库中

代码在线编译器(下)- 用户代码安全检测

代码在线编译器(下)- 用户代码安全检测

使用私有 api 检测 iOS 中启用的热点

UISearchBar 检测用户何时停止快速输入

在位置访问弹出 Swift 中检测用户选择