HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – NSFetchedResultsController对象在更新时从UITableView中删除大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
请温柔,这是我的第一篇文章.

当我更新子类NsmanagedObject并使用获取的结果控制器执行保存时,不是在“didChangeObject”中调用NSFetchedResultsChangeupdate,而是调用NSFetchedResultsChangedelete.保存工作并更新对象,但随后立即从UITableView中删除它.如果我退出并返回,该对象将重新显示在带有更新的tableview中,因此我知道它将其保存到数据库中.

我正在使用XCODE 5为一个简单的任务应用程序开发代码.我使用的是iPhone 4S而不是模拟器来测试它.它工作正常,直到我为代码的另一部分做了一些mods(我认为没有连接,现在它不起作用.

我有一个排序顺序,当我更新一个对象并且它按排序顺序改变时,有一个很好的动画可以移动UITableViewCells ….现在我必须强制再次获取并执行[self.tableView reloadData] .这是一个黑客,因为我没有得到任何动画,但它是我可以让它更新的唯一方法

我准备了segue方法

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender
{
// configure the desTination view controller:
if ( [segue.desTinationViewController isKindOfClass: [ShowEditTaskTableViewController class]])
{

    if ([sender isKindOfClass:[UITableViewCell class]] )
    {


        NSIndexPath *indexPath = [self.taskTableView indexPathForCell:sender];
        [self.taskTableView deSELEctRowATindexPath:indexPath animated:YES];

        // Pass the SELEcted task to the new view controller.
        ShowEditTaskTableViewController *detailViewController = segue.desTinationViewController;

        Task *info = [self.fetchedResultsController objectATindexPath:indexPath];
        detailViewController.editedObject = info;
    }
    else
    {

        NSIndexPath *indexPath = [self.taskTableView indexPathForCell:sender];
        [self.taskTableView deSELEctRowATindexPath:indexPath animated:YES];
        ShowEditTaskTableViewController *detailViewController =           segue.desTinationViewController;

        Task *info = (Task *)[NSEntityDescription insertNewObjectForEntityForName:@"Task" inManagedObjectContext:self.managedObjectContext];
        detailViewController.editedObject = info;




    }

}

}

这里没什么特别的. “任务”是我的NsmanagedObject.

我有一个倒带(编辑:在评论后反向更改倒带)segue,在调用之前,我设置了将被设置的变量存储在editedObject中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

if ([segue.identifier isEqualToString:@"addNewTaskSave"]) {
    // Note: This is an unwind segue to go BACk to the prevIoUs screen.

    self.dueDate = self.taskDatePicker.date;
    self.description = self.taskDescriptiontextView.text;
    self.priority = self.taskPrioritySegment.SELEctedSegmenTindex;
    }
}

并在RootViewController中调用

- (IBACtion)addNewTaskSave:(UIStoryboardSegue *)segue
{

ShowEditTaskTableViewController *controller = segue.sourceViewController;

controller.editedObject.shortDesc = controller.description;
controller.editedObject.priority = @(controller.priority);

controller.editedObject.dueDate = controller.dueDate;
controller.editedObject.completed = @0;

NSError *error;
if (![self.managedObjectContext save:&error]) {
    ...
}

…..@H_450_30@@R_618_8787@

它使用标准的didChangeObject委托方法.这很好,直到我明显改变了一些东西.

现在,在保存之后,它会设置NSFetchedResultsChangedelete选项并删除表行.

修复是添加

self.fetchedResultsController = nil;

if (![[self fetchedResultsController] performFetch:&error]) {
   ...
}
[self.taskTableView reloadData];

但是,这意味着实际观察到的只是表视图的直接更新而没有动画.

如果没有此代码,您可以观察到表行的动画删除.如果我退出并重新启动,我编辑的对象就在那里.

我已经搜索了过去4周(我编写IOS的时间)一直是我不变的伴侣,并且找不到任何有关此行为的信息.

任何帮助将不胜感激.

编辑:

在保存之前,controller.editedObject isdeleted = NO,isupdated = YES,所以我看不出它为什么设置NSFetchedResultsControllerChangedelete.

解决方法

我只想讨论你的一段代码;这可能与描述的获取结果控制器问题无关.

你所谓的放松/逆转让我感到难过.我不认为prepareForSegue:sender:与官方展开segue相关.所以也许你并没有真正使用官方展开segue(通过控制 – 从按钮拖动到故事板场景下的“退出”图标创建).

除非你指的是一个unwind segue,否则没有“反向”segue会让你回到之前的屏幕.例如,推送segue没有称为“pop”segue的单独对应物.

我怀疑你在故事板中的两个场景之间有纵横交错.换句话说,你创建了一个从场景A到场景B的segue,你创建了一个从场景B到场景A的segue.如果确实如此,我会避免这样做,因为它是非常规的.也许花点时间回顾一下segues.

好的,我将简要介绍获取的结果控制器问题.如果在由获取的结果控制器填充的表视图中存在用户驱动的数据更改,则需要设置一个标志并暂时“关闭获取的结果控制器委托方法.在“用户驱动的更新”下的NSFetchedResultsControllerDelegate协议的文档中简要提到了此问题.

大佬总结

以上是大佬教程为你收集整理的ios – NSFetchedResultsController对象在更新时从UITableView中删除全部内容,希望文章能够帮你解决ios – NSFetchedResultsController对象在更新时从UITableView中删除所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。