2015-09-17 30 views
1

我有一个表格视图,其中两个单元格有用户可以输入长数据的UITextView。在#1这里以下一些答案,我实现了一个协议/委托检测,当用户完成输入,然后将被保存在一个全局字典中的数据:Swift:热检测用户编辑已停止在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的委托本身就是类。

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

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

UPDATE

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

你可以用tableView:cellForRowAtIndexPath(tag)得到它,它返回单元格 –

回答

1

只使用在该法测得的顶这条线在你的控制器

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

我面临着同样的方式进行:与“微调”按钮的功能问题,我的单元格textfields,我想检查控制器中的所有字段。当我得到我的数据,所以最后的数据不是最新的,因为在最后的数据后,我点击不在文本字段上的按钮。所以我找到了解决方案。在获得我的字典之前,我在我的方法中写了这行(在你的情况下,这行应该是很好的方法),之后我更新了数据。 感谢

+0

谢谢队友,太感谢你我真的希望就是这么简单......我,只要我完成了我的代码重构试试! –

+0

好的。如果它不起作用,请在这里回复我。谢谢(Y) –

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 
    } 
+0

PS。 selectedIndexPath = indexPath应该是当用户开始编辑文本肯定 –

+0

谢谢你的心脏队友!我会尽快完成我的代码重构! –