【问题标题】:UITableView reload data animationUITableView 重载数据动画
【发布时间】:2014-06-26 14:42:23
【问题描述】:

我遇到了 UITable 的问题。当我使用主 UITableViewController 删除行时它工作正常,它隐藏了。但是现在我遇到了问题,因为我在 UIViewController(MainViewController) 上有 UITableView(_domainTableView)。它工作正常,但是当我想删除行时它不会隐藏它,当我关闭并关闭应用程序时,此行被删除,但我想比以前自动和动画。你有什么解决办法吗?

#import "MainViewController.h"

@interface MainViewController ()

@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;

@end

@implementation MainViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    CAGradientLayer *bgLayer = [backgroundGradient blueGradient];
    bgLayer.frame = self.view.bounds;
    [self.view.layer insertSublayer:bgLayer atIndex:0];

    UIImage *image = [UIImage imageNamed: @"logo"];
    UIImageView *imageview = [[UIImageView alloc] initWithImage: image];

    self.navigationItem.titleView = imageview;

    [self.fetchedResultsController performFetch:nil];

    _domainTableView.dataSource = self;
    _domainTableView.delegate = self;

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.fetchedResultsController.sections.count;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewCellEditingStyleDelete;
}

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    Domain *domain = [self.fetchedResultsController objectAtIndexPath:indexPath];
    CoreDataStack *coreData = [CoreDataStack defaultStack];
    [[coreData managedObjectContext] deleteObject:domain];
    [coreData saveContext];
//    [self.domainTableView reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
    return [sectionInfo numberOfObjects];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    Domain *domain = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = domain.name;

    return cell;
}

- (NSFetchRequest *)entryListFetchRequest {
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Domain"];

    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]];

    return fetchRequest;
}

- (NSFetchedResultsController *)fetchedResultsController
{
    if(_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }

    CoreDataStack *coreDataStack = [CoreDataStack defaultStack];
    NSFetchRequest *fetchRequest = [self entryListFetchRequest];

    _fetchedResultsController = [[NSFetchedResultsController alloc]
                                 initWithFetchRequest:fetchRequest managedObjectContext:coreDataStack.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

//    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.domainTableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.domainTableView endUpdates];
}

@end

【问题讨论】:

    标签: objective-c xcode uitableview uiviewcontroller


    【解决方案1】:

    看起来fetchedResultsController 没有附加任何委托。您是否尝试取消注释以下行?是故意注释掉的吗?

    //    _fetchedResultsController.delegate = self;
    

    【讨论】:

    • 当我取消注释时它会显示警报Assigning to ‘id&lt;NSFetchedResultsControllerDelegate&gt;’ from incompatible type ‘MainViewController *const_strong'
    • 所以你需要通知MainViewController正在实现NSFetchedResultsControllerDelegate
    • 我知道但我不知道_domainTableView.dataSource = self; _domainTableView.delegate = self;怎么不够?
    • 不,dataSource 和delegate 只是控制tableView。获取结果控制器管理核心数据连接和数据更改。您也需要实现 NSFetchedResultControllerDelegate (我可以看到已经完成)。您可以在文档developer.apple.com/library/ios/documentation/CoreData/… 中阅读相关内容
    【解决方案2】:

    您需要使用- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 方法来实际为删除行设置动画。您的 commitEditingStyle 方法应该如下所示:

    -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            Domain *domain = [self.fetchedResultsController objectAtIndexPath:indexPath];
            CoreDataStack *coreData = [CoreDataStack defaultStack];
            [[coreData managedObjectContext] deleteObject:domain];
            [coreData saveContext];
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]
        }
    }
    

    一些可能有用的文档:

    Inserting and Deleting Rows and Sections

    UITableView Class Reference

    【讨论】:

      猜你喜欢
      • 2013-04-07
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多