1

私はアプリケーションでCoreDataを使用していますが、これは1対多の関係であり、とという2つのエンティティがfoldersありfilesます。したがって、フォルダには多くのファイルを含めることができます。したがって、最初のView Controllerにはすべてのフォルダーが表示され、各フォルダーをクリックすると、そこに存在するファイルが表示されます。

これで、そこに存在するすべてのフォルダーとファイルはユーザーによって動的に作成され、データベースやWebサーバーからのものではありません。

これで、アプリデリゲートから開いたView Controllerがもう1つあります。ここで、いくつかのファイルを表示します。

managedObjectContextまず、アプリデリゲートで宣言されるを渡す必要があることを知っています

ViewController *View = [[ViewController alloc]initWithNibName: @"ViewController" bundle:nil]
View.managedObjectContext = self.managedObjectContext;

したがって、を渡すだけmanagedObjectContextで、ファイルエンティティオブジェクトにアクセスできますか、またはファイルエンティティオブジェクトも渡す必要があります。

ご存知のように、とという2つのエンティティがFolderありFile、任意のフォルダに保存されているファイルにアクセスするために、これを実行します。

NSMutableArray *filesArray = [self.folder.file mutableCopy];

しかし今、私は必要なanyViewにファイルを表示したいと思います。これは、2つの3つのナビゲーションの後に開くか、appDelegate.mから直接開くことができます。

非常に明確にするために、私の質問はこれをどのように行うかです。つまり、からfilesArrayを取得するにはどうすればよいですかAppDelegate

以下の回答に基づいて編集されました。この方法でfetchResultsControllerを作成しました

- (NSFetchedResultsController *)fetchedResultsController {

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

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"File" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"alarm" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"alarm!= nil"]];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchResultsController performFetch:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    
    return  m_fetchResultsController;   
}

そしてViewDidLoadで私はこのように書いた

- (void)viewDidLoad
{
    [super viewDidLoad];
   NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }


     NSMutableArray *alarms = [[self.fetchResultsController fetchedObjects]mutableCopy];

    NSLog(@"alarmsCount:%d",[alarms count]);
}

よろしくランジット。

4

1 に答える 1

2

あなたがより多くの詳細を共有するならば、我々はあなたを助けることができます、しかしそれまでの間...

マスターコントローラーにフォルダーが表示され、詳細コントローラーにファイルが表示される場合は、選択したフォルダーの参照を詳細コントローラーに挿入するだけです。

たとえば、このような詳細コントローラでプロパティを作成します(合成する必要があります)

@property (nonatomic,strong) Folders* currentFolder;

詳細コントローラを作成するときは、次のようにします

DetailController* detCtr = // alloc-init here
detCtr.currentFolder = // the folder you want to pass in

いくつかの注意事項

キャメルケース表記を使用します。NSFetchedResultsControllerテーブルなどに関連するデータの遅延読み込みに使用します。エンティティの名前Filesを変更Foldersし、それらを単数形にします。

編集

わかりました。アプリ内のどこからでもアプリデリゲートにアクセスしたい場合は、

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate someMethod];

ここでは、.hで宣言され、.mで合成されたパブリックプロパティを使用して、関心のあるフォルダーを取得できます。

さて、これは従うべきあまり良いアプローチではありません。AppDelegateクラスはそのまま残ります。

もう1つのよりエレガントなアプローチは、視覚化する必要SharedManagerのあるものを格納する(または他の何か)と呼ばれるシングルトンを作成することです。currentFolder

SharedManagerは次のようになります

//.h
@property (nonatomic,strong) Folder* currentFolder;

+ (SharedManager*)sharedInstance;


//.m
@synthesize currentFolder;

+ (SharedManager*)sharedInstance
{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[SharedManager alloc] init];
    });
    return sharedInstance;
}

つまり、インポート後、フォルダを現在のフォルダとして設定するために使用されます

[[SharedManager sharedInstance] setCurrentFolder:theFolderYouWantToShare];

または現在のフォルダを取得します

Folder* theSharedFolder = [[SharedManager sharedInstance] currentFolder];

PSシングルトンを乱用しないでください。私が使用するシングルトンパターンには、iOS4以降が必要です。

編集2

私の責任です。私はその質問を理解していませんでした。

すべてのファイルを取得する必要がある場合はNSFetchRequest、次のように作成できます。

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"File" inManagedObjectContext:context]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];

NSError *error = nil; 
NSArray *results = [context executeFetchRequest:request error:&error];

ここresultsには、ストア内のすべてのファイルが任意のフォルダーから独立して含まれます。この配列を使用して、テーブル内のファイルを表示できます。

ファイルがたくさんある場合は、NSFetchedResultsControllerクラスを確認することをお勧めします。と一緒に遅延読み込みが可能UITableViewです。

ここで良いチュートリアルを見つけることができます:NSFetchedResultsControllerの使用方法

編集3

リマインダーについてはどうすればいいですか?

NSFetchedResultsController次のような述語をリクエスト(で使用するもの)に提供する必要があります

[request setPredicate:[NSPredicate predicateWithFormat:@"reminder != nil"]];

このようにして、リマインダーがないファイルを取得しますnilreminderモデルで使用しているプロパティです。

PS Xcodeをサポートせずに書いたので、コードを確認してください。

于 2012-12-31T12:50:18.267 に答える