У меня есть табличный вид, где две ячейки имеют UITextView, в которые пользователь может вводить длинные данные. После некоторых ответов здесь в Stackoverflow, я реализовал протокол/делегат для обнаружения, когда пользователь закончит ввод данных, которые затем будут сохранены в глобальном словаре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 является самим классом.
«Проблема» в том, что только после того как пользователь вводит другую ячейку/поле, то текст хранится в глобальном словаре. Как насчет того, чтобы пользователь нажал кнопку «Fine» (чтобы сохранить данные), не коснувшись другого поля после того, как он закончил ввод текста? То, что роковая ошибка в ноль возникает. Поэтому я хотел бы знать, есть ли способ обнаружить, что пользователь прекратил печатать, даже если он все еще находится внутри этой ячейки, чтобы содержимое всегда хранилось. Возможно ли это? Существует ли конкретный метод для реализации?
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)
}
}
}
}
вы можете настроить словарь данных вручную, когда пользователь нажата «штраф» –
Да, я подумал об этом, но ... как я могу получить ячейку внутри этого метода? –
вы можете получить его с помощью tableView: cellForRowAtIndexPath (tag), он возвращает ячейку –