0

このエラーについて詳しく説明できないので、画面にエラーを記録しました。 http://www.youtube.com/watch?v=w2FqKKcL2Ck&feature=youtu.be 基本的にどうすればいいのかわかりません。ユーザーが [完了すべきタスク] セクションのすべてのタスクを完了したら、セクション ヘッダーをそこに残しておきたいと思います...オブジェクトが含まれていないだけです (単に、タスクを追加するために必要なためです)。

幸いなことに、ユーザーが完了したタスクを持っていない場合、そこにあるヘッダーは消えるはずです。トップヘッダーが消えないようにしたいのですが...

また、削除と同じこと。最後のオブジェクトが削除されたときに、「タスクを完了する」セクションが完全に消えてしまうのは本当に望ましくありません。

TAFetchResultsControllerのようなカスタム サブクラスを使用しない限り、これは不可能だと聞きましたが、それを使用してみましたが、複雑すぎて実装できませんでした (そして、アプリケーションを修正するのではなく、壊してしまいました)。多分あなたたちはいくつかの提案を持っていますか?

関連するコードを次に示します。

タスクのコア データ プロパティ

@interface Tasks : NSManagedObject
@property (nonatomic, retain) NSString *sectionString;
@end

@implementation Tasks
@dynamic sectionString;
@end

異なるセクションへのタスクの追加

NSManagedObjectContext *context = self.managedObjectContext;
    NSManagedObject *startingTask = [NSEntityDescription insertNewObjectForEntityForName:@"Tasks" inManagedObjectContext:context];
    [startingTask setValue:@"Eat Dinner" forKey:@"taskName"];
    [startingTask setValue:[NSNumber numberWithDouble:400] forKey:@"timeInterval"];
    [startingTask setValue:@"Tasks To Complete" forKey:@"sectionString"];

     NSManagedObject *finishedTask = [NSEntityDescription insertNewObjectForEntityForName:@"Tasks" inManagedObjectContext:context];
    [finishedTask setValue:@"Do Laundry" forKey:@"taskName"];
    [finishedTask setValue:[NSNumber numberWithDouble:400] forKey:@"timeInterval"];
    [finishedTask setValue:@"Completed Tasks" forKey:@"sectionString"];

    NSError *error;
    if (![context save:&error]) {
        NSLog(@"couldn't save: %@", [error localizedDescription]);
    } 

TableViewController.m:

-(void) viewDidLoad{

        // ---Start Core Data With NSFetchedResultsController---
[super viewDidLoad];
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]){
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    exit(-1);
}
// ---End Core Data w/ NSFetchedResultsController---

[self.tableView setDelegate:self];
[self setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
holdViewsArray = [[NSMutableArray alloc]init];

UIView *seperatorView;
UIView *seperatorView2;

NSString *sectionTitle = @"Tasks To Complete";
NSString *section2Title = @"Completed Tasks";
UILabel *label = [[UILabel alloc]init];
UILabel *label2 = [[UILabel alloc]init];

label.frame = CGRectMake(10.0, 5.0, 320.0, 50.0);
label.text = sectionTitle;

label2.frame = CGRectMake(10.0, 0.0, 320.0, 40.0);
label2.text = section2Title;

headerView = [[UIView alloc]initWithFrame:label.frame];
headerView2 = [[UIView alloc]initWithFrame:label2.frame];

CGRect sepFrame = CGRectMake(0, headerView.frame.size.height-2, 320, 1);
CGRect sep2Frame =CGRectMake(0, headerView2.frame.size.height-2, 320, 1);

seperatorView = [[UIView alloc] initWithFrame:sepFrame];
seperatorView2 = [[UIView alloc]initWithFrame:sep2Frame];

[headerView addSubview:seperatorView];
[headerView2 addSubview:seperatorView2];
[headerView addSubview:label];
[headerView addSubview:button];
[headerView2 addSubview:label2];
[holdViewsArray addObject:headerView];
[holdViewsArray addObject:headerView2];
    - (NSFetchedResultsController *)fetchedResultsController {

        if (_fetchedResultsController != nil) {
            return _fetchedResultsController;
        }

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription
                                       entityForName:@"Tasks" inManagedObjectContext:managedObjectContext];
        [fetchRequest setEntity:entity];

        NSSortDescriptor *isCompleted = [[NSSortDescriptor alloc]initWithKey:@"sectionString" ascending:NO];
        NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                                  initWithKey:@"dateCreated" ascending:YES];
        [fetchRequest setSortDescriptors:@[isCompleted, sort]];
        [fetchRequest setFetchBatchSize:20];

        NSFetchedResultsController *theFetchedResultsController =
        [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                            managedObjectContext:managedObjectContext sectionNameKeyPath:@"sectionString"
                                                       cacheName:nil];
        self.fetchedResultsController = theFetchedResultsController;
        _fetchedResultsController.delegate = self;

        return _fetchedResultsController;

    }-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
        Tasks *task = [_fetchedResultsController objectAtIndexPath:indexPath];
        cell.textLabel.text = task.taskName.uppercaseString;
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%.0f", task.timeInterval];
        cell.imageView.image = [UIImage imageNamed:@"unchecked.png"];
        cell.imageView.highlightedImage = [UIImage imageNamed:@"uncheckedhighlighted.png"];
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
        if (indexPath.section == 1)
        [cell.contentView setAlpha:0.5];
        else {
        [cell.contentView setAlpha:1];
        }

        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handlechecking:)];
        [cell.imageView addGestureRecognizer:tap];
        cell.imageView.userInteractionEnabled = YES;
    }
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
     cellSubclassCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
        if (!cell)
            cell = [[cellSubclassCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
        [self configureCell:cell atIndexPath:indexPath];
        return cell;
        }
    -(void)handlechecking:(UITapGestureRecognizer *)t{
            CGPoint tapLocation = [t locationInView:self.tableView];
            NSIndexPath *tappedIndexPath = [self.tableView indexPathForRowAtPoint:tapLocation];
            Tasks *task = [_fetchedResultsController objectAtIndexPath:tappedIndexPath];
        if ([task.sectionString isEqual: @"Tasks To Complete"]){
            task.sectionString = @"Completed Tasks";
        } else if ([task.sectionString isEqualToString:@"Completed Tasks"]){
        task.sectionString = @"Tasks To Complete";
        }
        [self.tableView reloadData];
        NSTimeInterval time = [[NSDate date] timeIntervalSinceReferenceDate];
        [task setDateCreated:time];
    }
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

    switch (section) {
    case 0:
            return [holdViewsArray objectAtIndex:0];
            break;
    case 1:
            return [holdViewsArray objectAtIndex:1];
            break;

    }
    return 0;
}
4

1 に答える 1

0

NSFetchedResultsControllerフェッチによって返されたオブジェクトからセクションを推測します。したがって、セクションの項目数がゼロになると、セクションは消滅します。それがまさに仕組みNSFetchedResultsControllerです。

最も簡単なオプションは、おそらくサードパーティのフレームワークです。TLIndexPathToolsを見てください。NSFetchedResultsControllerCore Data や を必要としない代替手段を提供しますNSFetchRequest。つまり、より多くのシナリオで使用できます。いくつかのサンプル プロジェクトを見てみましょう (Core Data のプロジェクトは"Core Data"と呼ばれます)。いくつかの優れた機能は、数行のコードで実行されます。

TLIndexPathTools は空のセクションをサポートしていますが、必要な方法で明示的にサポートしていません。ただし、 をオーバーライドすることにより、数行のコードで実現できますTLIndexPathController。コードは次のようになります。

@interface MyIndexPathController : TLIndexPathController
@end

#import "MyIndexPathController.h"
@implementation MyIndexPathController    

- (void)setDataModel:(TLIndexPathDataModel *)dataModel
{
    if ([dataModel sectionForSectionName:@"MyFirstSectionName"] == NSNotFound) {
        TLIndexPathSectionInfo *firstSection = [[TLIndexPathSectionInfo alloc] initWithItems:nil andName:@"MyFirstSectionName"];
        NSMutableArray *sectionInfos = [NSMutableArray arrayWithArray:dataModel.sections];
        [sectionInfos insertObject:firstSection atIndex:0];
        dataModel = [[TLIndexPathDataModel alloc] initWithSectionInfos:sectionInfos andIdentifierKeyPath:dataModel.identifierKeyPath andCellIdentifierKeyPath:dataModel.cellIdentifierKeyPath];
    }
    super.dataModel = dataModel;
}

@end

ここで何が起こっているかというと、(フェッチ要求の結果に基づいて) コントローラーによって生成されたデータ モデルをインターセプトし、対象のセクションが存在するかどうかを確認します。そうでない場合は、空のセクション情報オブジェクトを作成し、それを他のセクション情報と組み合わせて新しいデータ モデルにし、それをスーパー クラスに渡します。

必要に応じて、必要なセクションのセットで動作するように一般的に拡張することはそれほど難しくありません。

于 2013-07-27T04:48:26.810 に答える