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 中停止的主要内容,如果未能解决你的问题,请参考以下文章