在不同的控制器上使用选定的NSManagedObject

时间:2012-07-13 17:11:38

标签: core-data persistence xcode4.3 nsmanagedobject

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

问候

2 个答案:

答案 0 :(得分: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方法中设置以下谓词:

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

非常感谢您的帮助

答案 1 :(得分:0)

在没有看到你的实际项目的情况下,我知道的一种方式会起作用,但可能会有点太圆,一个回合就是添加一个属性" isSelectedPractice"到你的实体。你可以把它变成一个BOOL,但是我在核心数据中与BOOL的结果好坏参半,我更喜欢把它留作NSString并将其设置为" yes"或"不"。然后,当您将其下拉时,将其修改或将其作为实体添加到核心数据中,并将isSelectedPractice设置为" yes"。然后在你的其他控制器中,做一个

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

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