2015-09-17 4 views
1

У меня есть табличный вид, где две ячейки имеют 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 является самим классом.

И это скриншот приложения: enter image description here

«Проблема» в том, что только после того как пользователь вводит другую ячейку/поле, то текст хранится в глобальном словаре. Как насчет того, чтобы пользователь нажал кнопку «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) 
      } 

     } 
    } 
} 
+2

вы можете настроить словарь данных вручную, когда пользователь нажата «штраф» –

+0

Да, я подумал об этом, но ... как я могу получить ячейку внутри этого метода? –

+1

вы можете получить его с помощью tableView: cellForRowAtIndexPath (tag), он возвращает ячейку –

ответ

1

просто использовать эту линию на вершине в методе штрафа в контроллере

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

Я столкнулся с теми же проблема, мои текстовые поля в ячейке, и я хочу проверить все поля в контроллере. Когда я получу свои данные, поэтому последние данные не обновляются, потому что после последних данных я нажимаю кнопку не в текстовом поле. Поэтому я нашел решение. Я написал эту строку в своем методе (в вашем случае эта строка должна быть в тонком методе), прежде чем получить мой словарь, и после этого у меня были обновленные данные. Благодаря

+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

Спасибо, сердечный помощник! Я попробую, как только закончу рефакторинг кода! –