0

私は非常に基本的で明白な答えがあるはずの問題に遭遇しています.Appleのドキュメントのいくつかと、ここでの回答とオンラインのチュートリアルを読みました。

「月」エンティティのリストを表示するテーブルビューがあります (アプリはコア データを使用します)。その親月に含まれるすべての日のリストを表示したい別のテーブルビューに続きます。したがって、「月」エンティティのリストの行をタップすると、理想的には、たとえば 1 月の日付のみが一覧表示されます。

月と日の両方のテーブルビューには、月のエントリと日のエントリをそれぞれ追加する通常のビュー コントローラ (テーブルビュー VC ではない) への別個のセグエがあります。

データはモデル化されているため、Month はターゲットとして Days との対多の関係 (daysInMonths) を持ち、逆は対 1 の関係 (parentMonth) になります。

月の属性は「月」と「年」です。日の属性は、「月」、「日」、および「年」です。

現在、モデル オブジェクトのすべての属性は文字列です (理想的ではありませんが、次の演習でこれを変更します)。

月と日のエントリを追加できます。削除できます。問題は、最初のテーブルビュー (月) の行をタップすると、毎日のエントリが表示され、まったくフィルタリングされないことです。

Days tableview .m ファイルでフェッチされた結果コントローラーを設定するときに、述語を使用して、特定の親月に一致する日のみをフィルター処理すると想定しています。

このテーブルビューでのフェッチ リクエストは Days オブジェクトです。述語を設定するときに、そのフェッチ メソッド内で Month オブジェクトをインスタンス化する必要がありますか?

データを正しく関連付けるために「parentMonth」関係を設定するだけで、テーブルビューに表示される追加の Model オブジェクトを作成したくありません。

リレーションシップの概念は理解していますが、実際にコードで設定する方法が少しわかりません。

このようなフィルターを設定するのに最適な場所はどこですか?

私はおそらく十分に明確ではないことを認識しているので、他の質問にはできる限り答えます.

この種の機能はどこでも使用されているため、基本的なものが欠けていることはわかっていますが、自分で読んでもまだ要点を理解できていません...

@implementation DaysCDTVC

- (void)setupFetchedResultsController
{    
    // 1 - Get Entity 
    NSString *entityName = @"Days";
    NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName);

    // 2 - Request 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

    // 3 - Filter 

    //request.predicate = [NSPredicate predicateWithFormat: ????????????????

    // 4 - Sort 
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor     sortDescriptorWithKey:@"month"
                                                                                   ascending:YES
                                                                                  selector:@selector(localizedCaseInsensitiveCompare:)]];    

    //5 - Fetch 
    self.fetchedResultsController = [[NSFetchedResultsController alloc]   initWithFetchRequest:request
                                                                      managedObjectContext:self.managedObjectContext
                                                                          sectionNameKeyPath:nil
                cacheName:nil];

    [self performFetch];    
}

「performFetch」メソッドは関連付けられたクラスにあります。これは基本的に、スタンフォードの iTunes レクチャーで Paul Hegarty が教えたことと同じです。

4

1 に答える 1

1

自分のプロジェクトの 1 つからコードを転置しました。これで問題が解決するはずです。説明が必要な場合や問題がある場合はお知らせください。

daysテーブル ビュー コントローラーで、パブリック プロパティを作成します。

@property (nonatomic, strong) NSString *month;

monthテーブル ビュー コントローラーで、選択した月をdaysテーブル ビューコントローラーに渡します。

- (void)prepareForSegue
{
    //Get a pointer to the destination TVC.
    //Your final code should have a check to make sure the destination TVC is what you expect
    DaysTableViewController *destinationTVC = (DaysTableViewController*)segue.destinationViewController;

    //Pass over the month from the selected row.  I'm calling it selected month.
    //If you need help getting the selected month, let me know
    destinationTVC.month = selectedMonth
}

daysテーブル ビュー コントローラーで、渡された月を使用してフェッチ リクエストを作成します。

- (void)setupFetchedResultsController
{
    //Entity
    NSString *entityName = @"Days";

    //Fetch Request
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];

    //Sort
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"day" ascending:YES]];

    //Predicate
    request.predicate = [NSPredicate predicateWithFormat:@"ANY SELF.month = %@", self.month];

    //Fetch using the code you posted earlier
}
于 2013-09-07T01:24:50.203 に答える