1

I have a UITableView and each UITableViewCell contains an editable UITextView.

My data source is a NSMutableArray containing NSMutableDictionary that holds the text value and some styling keys for the text.

How can I (efficiently) make it so that any changes a user makes to the UITextView are updated in the corresponding datasource NSMutableDictionary?

4

3 回答 3

1

首先,您必须为每个 UITextView 分配一个标签,以确切知道您指的是哪个 UITextView。

然后,您必须在包含 tableview 的视图控制器中实现 UITextViewDelegate。然后,使这个视图控制器成为每个 UITextView 的委托。在这里阅读如何实现它:UITextViewDelegate 参考

寻找更适合您需求的协议方法(可能 - textView:shouldChangeTextInRange:replacementText:,每次文本在任何范围内更改时都会调用它。

在委托方法中,您可以使用 UITextView.text 属性读取文本,并将此值分配给您的数据模型(字典)。

另一种可能的方法是使用 KVO 模式,但它需要更多的编码和对模式和实现的更好理解。希望能帮助到你!

于 2013-06-01T23:23:44.717 回答
1

一种相当简单的方法是利用表的索引路径,它不是最干净的,因此它取决于数据源的复杂性,以及是否有多个表等。

您可以做的是当用户结束编辑 textView 或在 tableView 中选择另一行时,您读取所选行的 indexPath(这要求该行在编辑 textView 时保持实际处于选定状态,默认情况下) . 从那里你调用你的更新方法。

要赶上编辑的结束,您实施

-(void)textViewDidEndEditing:(UITextView *)textView
{
   NSIndexPath *selectedpath = [myTable indexPathForSelectedRow];
   [self myUpdateMethodForIndexPath:selectedpath];
}

要捕获取消选择表格行并且不会调用上述内容,您可以实现

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
  [self myUpdateMethodForIndexPath:indexPath];
}

然后,您的更新方法必须在 indexPath 的相应单元格中读取 textView 的值,并在数据源中进行处理。当然,要关心部分,您需要正确处理 indexPath,在示例中仅使用行(1 部分)。

-(void)myUpdateMethodForIndexPath:(NSIndexPath *)editPath 
{
 UITableViewCell *editCell = [myTable cellForRowAtIndexPath:editPath];
 NSString *newText = editCell.theTextView.text;
 ....
 NSMutableDictionary *dict = [myDictArray objectAtIndex:editPath.row];
 ....
}
于 2013-06-01T23:40:06.513 回答
0

让您的视图控制器成为每个文本视图的代表。侦听适当的事件以获取更新的文本。然后让视图控制器使用更新后的文本更新数据模型。

如果您有自定义单元格,则让该单元格成为文本视图委托。然后单元格应通知其代表(视图控制器)有关更新的文本。当然,这要求您的自定义单元类定义自己的委托协议,并且视图控制器应该使自己成为每个单元的委托。

对于这样一个模糊的问题,这与答案一样具体。

于 2013-06-01T23:05:48.767 回答