使用自定义 Table 查看单元格检测用户所在的单元格
Detect Which Cell a User is in With Custom Table View Cell
我有一个带有两 (2) 个文本视图的自定义 tableViewCell 供用户输入。我想检测用户所在的 tableView 行。我试过:
let currentIndexPath = tableView.indexPathForSelectedRow!
let currentCell = tableView.cellForRowAtIndexPath(currentIndexPath) as! Test2TableViewCell
和 Xcode 给我错误,fatal error: unexpectedly found nil while unwrapping an Optional value
对我来说,这意味着该应用程序无法找到选定的行。我假设当用户在 tableViewCell 顶部的 textView 中键入时,应用程序看不到您点击实际的单元格。 有没有办法检测用户在哪一行?
考虑使用出现在所有 UIView 子类上的标签 属性。
internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("CustomCell"){
cell.textView.tag = indexPath.row
}
}
internal func textViewDidBeginEditing(textView: UITextView){
let row = textView.tag
}
您说得对,当您在单元格中键入 UITextField 时,单元格没有被选中。
完成此操作的一种快速方法是将行保存为 UITextView 的标记,然后在 textViewDidFinish
... 委托方法中创建索引路径,并将该部分和标记作为行。
或者,您可以为每个唯一的 textView 创建一个变量,然后通过比较两者来比较您在 textViewDidFinish
委托方法中使用的 textView。
您可以使用块在您的 cellForRow 方法中检查它:
internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("CustomCell"){
cell.editingDidBeginHandler = { [self weak], text
//do your stuff, save index path, or tag or something else.
}
}
}
在您的 UITableViewCell 子类中:
var editingDidBeginHandler:(()->())?
internal func textViewDidBeginEditing(textView: UITextView){
if let handler = editingDidBeginHandler { editingDidBeginHandler() }
}
您可以将 textView 点转换为 table 视图点以确定其索引路径。
func textViewDidBeginEditing(textView: UITextView) {
let pointInTable = textView.convertPoint(textView.bounds.origin, toView: yourTableView)
let textViewIndexPath = yourTableView.indexPathForRowAtPoint(pointInTable)
// do something else
}
这是假设您将文本视图委托设置为 table 视图。
如果将文本视图委托设置为自定义单元格,则需要在自定义单元格中捕获 textViewDidBeginEditing
函数,然后使用协议将事件传递给 table 视图。
我有一个带有两 (2) 个文本视图的自定义 tableViewCell 供用户输入。我想检测用户所在的 tableView 行。我试过:
let currentIndexPath = tableView.indexPathForSelectedRow!
let currentCell = tableView.cellForRowAtIndexPath(currentIndexPath) as! Test2TableViewCell
和 Xcode 给我错误,fatal error: unexpectedly found nil while unwrapping an Optional value
对我来说,这意味着该应用程序无法找到选定的行。我假设当用户在 tableViewCell 顶部的 textView 中键入时,应用程序看不到您点击实际的单元格。 有没有办法检测用户在哪一行?
考虑使用出现在所有 UIView 子类上的标签 属性。
internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("CustomCell"){
cell.textView.tag = indexPath.row
}
}
internal func textViewDidBeginEditing(textView: UITextView){
let row = textView.tag
}
您说得对,当您在单元格中键入 UITextField 时,单元格没有被选中。
完成此操作的一种快速方法是将行保存为 UITextView 的标记,然后在 textViewDidFinish
... 委托方法中创建索引路径,并将该部分和标记作为行。
或者,您可以为每个唯一的 textView 创建一个变量,然后通过比较两者来比较您在 textViewDidFinish
委托方法中使用的 textView。
您可以使用块在您的 cellForRow 方法中检查它:
internal func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell:CustomCell = tableView.dequeueReusableCellWithIdentifier("CustomCell"){
cell.editingDidBeginHandler = { [self weak], text
//do your stuff, save index path, or tag or something else.
}
}
}
在您的 UITableViewCell 子类中:
var editingDidBeginHandler:(()->())?
internal func textViewDidBeginEditing(textView: UITextView){
if let handler = editingDidBeginHandler { editingDidBeginHandler() }
}
您可以将 textView 点转换为 table 视图点以确定其索引路径。
func textViewDidBeginEditing(textView: UITextView) {
let pointInTable = textView.convertPoint(textView.bounds.origin, toView: yourTableView)
let textViewIndexPath = yourTableView.indexPathForRowAtPoint(pointInTable)
// do something else
}
这是假设您将文本视图委托设置为 table 视图。
如果将文本视图委托设置为自定义单元格,则需要在自定义单元格中捕获 textViewDidBeginEditing
函数,然后使用协议将事件传递给 table 视图。