好吧,我现在真的遇到了以下问题:
我有两个类:NoticeViewAddController(让我们称之为vc1)和NoticeViewAddControllerAddNotice(让我们称之为vc2)。
vc1调用vc2。在vc2中有一个UITextView,用户可以在其中添加一些文本并点击保存(保存按钮将其保存到Core Data,但这不是重点)。 当我想再次弹出vc2并显示vc1时,我希望它的UITableViewCell从vc2的UITextView获取文本(还需要重新加载UITableView,不是吗?)。
从我到目前为止所读到的,去植被和协议似乎是最优雅的方式,但我真的不明白。
任何帮助将不胜感激!
答案 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的快乐,并且您不会收到有关它们不同步的任何错误。 (如果您只是更改单元格的内容,这可能不是一个大问题。)
当我回到办公室并在此发布时,我会为你挖掘一个例子。我周末在一个与我合作的项目上做了这件事,它解决了很多问题。