1

Practice というエンティティがあり、SelectorViewController という View Controller を使用して、プラクティスの 1 つである selectedPractice を選択します。次に、selectedPractice を RegularViewController というビュー コントローラーに返します。このビュー コントローラーでは、selectedPractice 属性の一部を表示します。これはすべて正常に機能します。ただし、このアプリには、RegularViewController のインスタンスからのモーダル セグエによって到達できる他の多くの View Controller があります。その結果、RegularViewController を離れてから戻ってくると、selectedPractice は null としてリセットされます。また、SelectorViewController で以前に設定されている場合は、アプリの初期化時に使用できるように selectedPractice を保存したいと思います。selectedPractice をアプリ全体で永続化し、実行時に利用できるようにすることで、これを実現するにはどうすればよいですか?

よろしく

4

2 に答える 2

1

素晴らしい上記の投稿のおかげで、私はそれをソートすることができました。非常に不器用かもしれませんが、動作します。

まず、fetchedObjects を SelectorView Controller の PickerView にロードしたときに、次のコードで属性「isSelectedPractice」を「NO」に設定しました。

for (Practice *fetchedPractice in [self.fetchedResultsController fetchedObjects]) {
        [fetchedPractice setValue:@"NO" forKey:@"isSelectedPractice"];
        [self.managedObjectContext save:nil];

次に、選択したプラクティスについて次のことを特定しました。

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

    Practice *practice = [[self.fetchedResultsController fetchedObjects] objectAtIndex:row];
    self.selectedPractice = practice;
    NSLog(@"The '%@' practice was selected using the picker", self.selectedPractice.name); 
}

ビューが RegularViewController に戻ったので、selectedPractice の isSelectedPractice 属性を YES に設定しました。PickerView で複数の選択が isSelectedPractice YES の複数のオブジェクトになることを望んでいなかったので、私はこれを遅くしました。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SavedPractice Segue"])
    {
        [self.selectedPractice setValue:@"YES" forKey:@"isSelectedPractice"];
        [self.managedObjectContext save:nil];
        NSLog(@"Setting SelectedPractice as '%@' in RegularViewController with isSelectedPractice as '%@'",self.selectedPractice.name,self.selectedPractice.isSelectedPractice );
        RegularViewController *rvc= segue.destinationViewController;
        rvc.delegate = self;
        rvc.selectedPractice = self.selectedPractice;

    }
    else {
        NSLog(@"Unidentified Segue Attempted!");
    }
}

次に、RegularViewController の setupFetchedResultsController メソッドで次の Predicate を設定します。

request.predicate = [NSPredicate predicateWithFormat:@"isSelectedPractice = %@", @"YES"];

助けてくれてありがとう

于 2012-07-14T17:30:51.443 に答える
0

あなたの実際のプロジェクトを見なくても、私が知っている1つの方法はうまくいくかもしれませんが、エンティティに属性「isSelectedPractice」を追加するのは少し丸すぎるかもしれません. BOOL にすることもできますが、Core Data の BOOL と結果が混在しています。単に NSString のままにして、「yes」または「no」に設定することを好みます。次に、それをプルダウンするか、変更するか、「yes」に設定された isSelectedPractice を持つエンティティとしてコア データに追加します。次に、他のコントローラーで、

if (self.managedObjectContext == nil) {
    self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

次に、"yes" に等しい isSelectedPractice を探している述語を持つエンティティを取得するためにフェッチ リクエストを実行します。これを行う方法に関する実際のコード サンプルが必要な場合はお知らせください。編集します。

于 2012-07-13T19:16:31.477 に答える