使用protocol / delegate从另一个类更改UITableViewCell

时间:2011-10-31 11:02:14

标签: uitableview delegates uitextview

好吧,我现在真的遇到了以下问题:

我有两个类:NoticeViewAddController(让我们称之为vc1)和NoticeViewAddControllerAddNotice(让我们称之为vc2)。

vc1调用vc2。在vc2中有一个UITextView,用户可以在其中添加一些文本并点击保存(保存按钮将其保存到Core Data,但这不是重点)。 当我想再次弹出vc2并显示vc1时,我希望它的UITableViewCell从vc2的UITextView获取文本(还需要重新加载UITableView,不是吗?)。

从我到目前为止所读到的,去植被和协议似乎是最优雅的方式,但我真的不明白。

  1. vc1是否必须拥有该协议?
  2. 该协议应采用哪种方法?
  3. 如何更改indexPath.section == 0和indexPath.row == 0的cell.textLabel.text。
  4. 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

我认为在这种情况下协议会太多。通过设置ivar& amp来坚持实施代表。 vc2中的属性:

@class vc1;

interface vc2 {
    vc1* delegate
...
}
@property (nonatomic, assign) vc1* delegate;

将其定义为assign,然后您不需要对其进行内存管理。 在vc1中,在调用vc2:

之前设置委托
[vc2_instance setDelegate:self];

在vc1中,您需要一个回调方法来通知结果:

- (void) notify:(NSString* thetext);

notify方法是重新加载表视图的理想位置。 然后在弹出它之前在vc2中调用它:

[delegate notify:textlabel.text];

跳这有帮助。

答案 1 :(得分:0)

如果您在表视图中使用NSFetchedResultsController,这相当容易。有了它,您可以在vc1视图控制器中实现NSFetchedResultsControllerDelegate协议方法:

– controllerWillChangeContent:
– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
– controller:didChangeSection:atIndex:forChangeType:
– controllerDidChangeContent:

这样,当您在vc2 viewcontroller中保存对managedObjectContext的更改时,将自动生成hasChanges事件,通知fetchedResultsController,fetchedResultsController将执行这些委托方法。您的表将使用委托方法中的代码自动更新更新。在您的情况下,我认为您的重点是controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:方法,其中更改类型为NSFetchedResultsChangeUpdate

如果是更新类型,您只需在indexPath配置单元格,就像在tableView协议方法insertRowsAtIndexPaths:withRowAnimation:中一样。当然,在这种情况下,单元格已经在表格中,因此您不会插入它,但是您正在重新配置它。

您将使用1controllerWillChangeContent括起您的委托方法:and 1controllerDidChangeContent:分别包含对[tableView beginUpdates];[tableView endUpdates]的调用(其中tableView更改为对tableView对象的引用)。这些更改在完成更改时保持fetchedResultsController和tableView的快乐,并且您不会收到有关它们不同步的任何错误。 (如果您只是更改单元格的内容,这可能不是一个大问题。)

当我回到办公室并在此发布时,我会为你挖掘一个例子。我周末在一个与我合作的项目上做了这件事,它解决了很多问题。