使用协议/委托从另一个类更改UITableViewCell
嗯,我现在真的遇到了以下问题: 我有两个类:NoticeViewAddController(我们称之为vc1)和NoticeViewAddControllerAddNotice(我们称之为vc2) vc1调用vc2。在vc2中有一个UITextView,用户可以在其中添加一些文本并点击save(保存按钮将其保存到核心数据中,但这不是重点)。 当我想弹出vc2并再次显示vc1时,我希望其UITableView单元格从vc2的UITextView中获取文本(也需要重新加载UITableView,不是吗?) 从我到目前为止所读到的内容来看,删除和协议似乎是最优雅的方式,但我真的不明白使用协议/委托从另一个类更改UITableViewCell,uitableview,delegates,uitextview,Uitableview,Delegates,Uitextview,嗯,我现在真的遇到了以下问题: 我有两个类:NoticeViewAddController(我们称之为vc1)和NoticeViewAddControllerAddNotice(我们称之为vc2) vc1调用vc2。在vc2中有一个UITextView,用户可以在其中添加一些文本并点击save(保存按钮将其保存到核心数据中,但这不是重点)。 当我想弹出vc2并再次显示vc1时,我希望其UITableView单元格从vc2的UITextView中获取文本(也需要重新加载UITableView,不是
任何帮助都将不胜感激 我认为在这种情况下,协议太多了。只需通过在vc2中设置ivar和属性来实现委托即可:
@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];
跳过此选项会有所帮助。如果您在表视图中使用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
如果是更新类型,则可以在indepath
处配置单元格,方法与在tableView协议方法insertRowsAtIndexPaths:withRowAnimation:
中配置单元格的方法相同。当然,在本例中,单元格已经在表中,因此您没有插入它,而是在重新配置它
您将用包含对[tableView BeginUpdate]的调用的1控件WillChangeContent:和1控件IDChangeContent:
括起您的委托方法
和[tableView endUpdates]
分别(其中tableView
更改为对tableView对象的引用)。在进行更改时,这些操作可以使fetchedResultsController和tableView保持愉快,并且不会出现任何关于它们不同步的错误。(如果只更改单元格的内容,这可能不是什么大问题。)
当我回到办公室后,我会为你找出一个例子,并把它贴在这里。我在周末的一个项目中做了这个,它解决了很多问题