从UITableView中的UITextView更新DataSource

时间:2013-06-01 22:35:47

标签: ios objective-c nsmutabledictionary uitableview

我有一个UITableView,每个UITableViewCell都包含一个可编辑的UITextView

我的数据源是NSMutableArray,其中包含NSMutableDictionary,其中包含文本的文本值和一些样式键。

我如何(有效地)创建它以便用户对UITextView所做的任何更改都会在相应的数据源NSMutableDictionary中更新?

3 个答案:

答案 0 :(得分:1)

首先,您必须为每个UITextView分配一个标签,以确切地知道您所引用的UITextView。

然后,您必须在包含tableview的视图控制器中实现UITextViewDelegate。然后,使此视图控制器成为每个UITextView的委托。请在此处阅读如何实施它:UITextViewDelegate reference

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

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

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

答案 1 :(得分: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];
 ....
}

答案 2 :(得分:0)

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

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

对于这样一个模糊的问题,具体的答案可能就是这样。