2011-10-31 123 views
0

好改变的UITableViewCell,我真的坚持了,现在下面的问题:使用协议/委托另一类别

我有2类:NoticeViewAddController(姑且称之为VC1)和NoticeViewAddControllerAddNotice(姑且称之为VC2) 。

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

从我至今读,delegetation和协议似乎是最优雅的方式,但我真的不明白这一点。

  1. 是否VC1必须有协议?
  2. 该协议中应该使用哪种方法?
  3. 我怎样才能然后更改indexPath.section == 0和indexPath.row == 0)的cell.textLabel.text。

任何帮助,将不胜感激!

回答

0

我认为协议是在这种情况下太多。只要坚持在VC2设置伊娃&财产实施委托:

@class vc1; 

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

把它定义为分配,然后你不需要内存管理。 在VC1,设置委托调用VC2前:

[vc2_instance setDelegate:self]; 

在VC1你需要一个回调方法通知结果:

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

的通知方法是重新加载表视图的理想场所。 然后你只是弹出出来之前把它在VC2:

[delegate notify:textlabel.text]; 

合这有助于。

0

这是相当容易,如果你使用的是NSFetchedResultsController您的表视图。有了这一点,你可以实现NSFetchedResultsControllerDelegate协议方法在VC1视图控制器:

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

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

如果是更新类型,您可以像在tableView协议方法insertRowsAtIndexPaths:withRowAnimation:中那样配置单元格indexPath。当然,在这种情况下,单元格已经在表格中,所以你没有插入它,但是你正在重新配置它。

你将你的括号委托方法与1controllerWillChangeContent:and 1controllerDidChangeContent:含有调用分别[tableView beginUpdates];[tableView endUpdates](其中tableView被改变为参考到您的tableView对象)。当更改完成时,这些将保持fetchedResultsController和tableView的高兴,并且不会出现关于它们不同步的任何错误。 (如果你只是改变一个单元格的内容,这可能不是一个大问题。)

当我回到我的办公室并将它发布到这里时,我会为你挖出一个例子。我在周末参与了一个我正在合作的项目,并解决了很多问题。