使用协议/委托从另一个类更改UITableViewCell

使用协议/委托从另一个类更改UITableViewCell,uitableview,delegates,uitextview,Uitableview,Delegates,Uitextview,嗯,我现在真的遇到了以下问题: 我有两个类:NoticeViewAddController(我们称之为vc1)和NoticeViewAddControllerAddNotice(我们称之为vc2) vc1调用vc2。在vc2中有一个UITextView,用户可以在其中添加一些文本并点击save(保存按钮将其保存到核心数据中,但这不是重点)。 当我想弹出vc2并再次显示vc1时,我希望其UITableView单元格从vc2的UITextView中获取文本(也需要重新加载UITableView,不是

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

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

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

从我到目前为止所读到的内容来看,删除和协议似乎是最优雅的方式,但我真的不明白

  • vc1必须有那个协议吗
  • 该协议中应该使用哪种方法
  • 然后如何更改indexath.section==0和indexPath.row==0)的cell.textLabel.text

  • 任何帮助都将不胜感激

    我认为在这种情况下,协议太多了。只需通过在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保持愉快,并且不会出现任何关于它们不同步的错误。(如果只更改单元格的内容,这可能不是什么大问题。)

    当我回到办公室后,我会为你找出一个例子,并把它贴在这里。我在周末的一个项目中做了这个,它解决了很多问题