1

我有一个名为 Practice 的实体,我使用一个名为 SelectorViewController 的视图控制器来选择其中一种做法 selectedPractice。然后我将 selectedPractice 返回到一个名为 RegularViewController 的视图控制器,在其中显示一些 selectedPractice 属性。所有这一切都很好。然而,该应用程序还有许多其他视图控制器,可以通过从 RegularViewController 实例的模态 segues 访问这些视图控制器。结果,如果我离开然后返回到 RegularViewController,selectedPractice 将重置为 null。如果之前已在 SelectorViewController 中设置,我还想保存 selectedPractice 以便在应用程序初始化时使用它。如何通过使 selectedPractice 在应用程序中持久化并在运行时可用来实现这一点?

问候

4

2 回答 2

1

感谢上面的帖子,这很棒,我设法对其进行了排序。这是我的代码,可能很笨拙,但它确实有效。

首先,当我将 fetchedObjects 加载到 SelectorView 控制器中的 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); 
}

当视图 Segue 回到 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

在没有看到您的实际项目的情况下,我知道一种可行但可能有点过于圆滑的方法是向您的实体添加一个属性“isSelectedPractice”。您可以将其设为 BOOL,但我在 Core Data 中与 BOOL 的结果不同,我更喜欢将其保留为 NSString 并将其设置为“是”或“否”。然后,当您将其拉下时,对其进行修改或将其作为实体添加到核心数据中,并将 isSelectedPractice 设置为“是”。然后在你的其他控制器中,做一个

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

然后执行获取请求以获取具有谓词的实体,该谓词正在寻找 isSelectedPractice 等于“是”。如果您需要有关如何执行此操作的实际代码示例,请告诉我,我将对其进行编辑。

于 2012-07-13T19:16:31.477 回答