核心数据 - 上下文不保存在第二个视图中

时间:2013-05-10 18:00:27

标签: ios objective-c core-data nsmanagedobject nsset

我试着正确地解释我的情况。

我有2个观点。在我的第一个视图中,我得到了一个列出事件的表。如果我触摸一个单元格,我会得到我的EventOverviewView。所以我对每个视图都有不同的行为:

FirstView(事件列表):

如果我触摸并按住其中一个单元格,我会显示一个UIActionSheet。在那里,我可以说我想加入那个事件,但在显示工作表之前,我从数组中获取所选事件并将其保存在临时变量中。所以在那个观点中我没有任何问题。一切都正确保存(我在SQLite浏览器中看到它)。

但正如我之前所说的那样,我可以说在我决定是否要加入之前我想看事件,此时我推送到提到的 EventOverviewView (事件对象已设置作为财产而不是零,我测试了它)。在这个视图中我也可以决定,如果我想加入,这里我们遇到了我的问题(以下方法处理将事件添加到事件中)。

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    EventOverviewController  *overView;

    if (actionSheet == eventUserInvitedSheet) {
        //member sheet
        switch (buttonIndex) {
            case 0:
                //join Event clicked //This method is executed and saved correctly in cd!!!
                [dccon addAcceptedUserToEvent:tmpEventForActionSheet :appUser];
                break;
            case 1:
                //Decline Event
                [dccon removeInvitedUserFromEvent:tmpEventForActionSheet :appUser];
                [dccon deleteEvent:tmpEventForActionSheet];
                break;
            case 2:
                //show event
                overView = [[EventOverviewController alloc]init];
                overView.eventObject = tmpEventForActionSheet;
                overView.appUser = appUser;                
                overView.hidesBottomBarWhenPushed = YES;
                [[self navigationController]pushViewController:overView animated:YES];
                break;
            case 3:
                //chat creator
                break;
        }
        totalEvents = [dccon getEvents];
        [eventsTable reloadData];
    }
}

该方法正确执行,如你所见,我在案例2上推送我的视图。在EventOverviewView上我有一个navbaritem,我在该视图上执行我的工作表:

创建不同的工作表取决于appUser的角色:

- (void)eventOptionSheet{
    if ([eventObject.createdBy.userID isEqualToString:appUser.userID]) {
        eventCreatorSheet = [[UIActionSheet alloc] initWithTitle:eventObject.name delegate:self
                                               cancelButtonTitle:@"Cancel"
                                          destructiveButtonTitle:@"Delete Event"
                                               otherButtonTitles: nil];
        eventCreatorSheet.actionSheetStyle = UIActionSheetStyleAutomatic;
        [eventCreatorSheet showFromTabBar:self.tabBarController.tabBar];
    }else{
        NSSet *invitedSet = eventObject.invitedUsers;
        NSSet *acceptedSet = eventObject.acceptedUsers;

        BOOL existsInInvitedList = [[invitedSet valueForKeyPath:@"objectID"] containsObject:appUser.objectID];
        BOOL existsInAcceptedList = [[acceptedSet valueForKeyPath:@"objectID"] containsObject:appUser.objectID];


        if (existsInInvitedList) {
            eventUserInvitedSheet = [[UIActionSheet alloc] initWithTitle:eventObject.name delegate:self
                                                       cancelButtonTitle:@"Cancel"
                                                  destructiveButtonTitle:nil
                                                       otherButtonTitles:@"Join", @"Decline", @"Chat creator", nil];
            eventUserInvitedSheet.actionSheetStyle = UIActionSheetStyleAutomatic;
            [eventUserInvitedSheet showFromTabBar:self.tabBarController.tabBar];
        }else if (existsInAcceptedList){
            eventUserAcceptedSheet = [[UIActionSheet alloc] initWithTitle:eventObject.name delegate:self
                                                        cancelButtonTitle:@"Cancel"
                                                   destructiveButtonTitle:nil
                                                        otherButtonTitles:@"Revoke invite", @"Chat creator", nil];
            eventUserAcceptedSheet.actionSheetStyle = UIActionSheetStyleAutomatic;
            [eventUserAcceptedSheet showFromTabBar:self.tabBarController.tabBar];
        }
    }

}

eventObject是我从列表视图中传递的对象

好吧,看看我的表格动作:

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    LastEventsViewController  *lastEvents;

    if (actionSheet == eventCreatorSheet) {
        // creator sheet
        switch (buttonIndex) {
            case 0:
                //Remove Event clicked
                [dccon deleteEvent:eventObject];
                lastEvents = [[LastEventsViewController alloc]init];
                [[self navigationController]popToRootViewControllerAnimated:YES];
                break;
        }
    }

    if (actionSheet == eventUserInvitedSheet) {
        //member sheet
        switch (buttonIndex) {
            case 0:
                //join Event clicked, logs proves that nothing is nil
                NSLog(@"Event test: %@, appUserTest: %@", eventObject.name, appUser.userID);
                // same like in first view, but don't save :(
                [dccon addAcceptedUserToEvent:eventObject :appUser];
                invitedUsers = [NSMutableArray arrayWithArray:[eventObject.invitedUsers allObjects]];
                acceptedUsers = [NSMutableArray arrayWithArray:[eventObject.acceptedUsers allObjects]];
                [acceptedUserList reloadData];
                [invitedUserList reloadData];
                break;
            case 1:
                //Decline Event
                [dccon removeInvitedUserFromEvent:eventObject :appUser];
                [dccon deleteEvent:eventObject];
                lastEvents = [[LastEventsViewController alloc]init];
                [[self navigationController]pushViewController:lastEvents animated:YES];
                break;
            case 2:
                //chat creator
                break;
        }
    }

    if (actionSheet == eventUserAcceptedSheet) {
        //member sheet
        switch (buttonIndex) {
            case 0:
                //leave Event clicked
                [dccon removeAcceptedUserFromEvent:eventObject :appUser];
                [dccon deleteEvent:eventObject];
                lastEvents = [[LastEventsViewController alloc]init];
                [[self navigationController]pushViewController:lastEvents animated:YES];
                break;
            case 1:
                //chat creator
                break;
        }
    }

    if (actionSheet == changeImageSheet) {
        UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
        imagePickerController.allowsEditing = YES;

        switch (buttonIndex) {
            case 0:
                //Remove user clicked
                imagePickerController.delegate = self;
                imagePickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;

                [self presentModalViewController:imagePickerController animated:YES];
                break;
            case 1:
                //Show Creator
                imagePickerController.delegate = self;
                imagePickerController.sourceType =  UIImagePickerControllerSourceTypePhotoLibrary;

                [self presentModalViewController:imagePickerController animated:YES];
                break;
        }
    }
}

最后但并非最不重要的是添加方法:

- (BOOL) addAcceptedUserToEvent:(Event*)event :(User*)invitedUser{
    BOOL saved = YES;

    [self getDataCoreContext];

    if (context) {

        [event removeInvitedUsersObject:invitedUser];
        [event addAcceptedUsersObject:invitedUser];

        NSError *error;
        if (![context save:&error]) {
            NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
            saved = NO;
        }
    }
    return saved;
}

我真的很困惑,为什么同样的方法正在我的第一个视图上工作但不在我的第二个视图上。我真的希望我能解释清楚。 ty已经有任何建议了!

编辑1: 返回的方法,上下文并将其分配给类变量:

@implementation DCConnector{
    NSManagedObjectContext *context;
    UtilitieHandler *utilitie;
}

- (NSManagedObjectContext *) getDataCoreContext{
    /** one line complete init */
    CoreDataStack* cdStack = [CoreDataStack coreDataStackWithModelName:@"Model"];

    /** one property you need for all Core Data method calls */
    if (context == nil) {
        context = cdStack.managedObjectContext;
    }
    return context;
}

编辑2: 我激活了SQLite调试功能,看看insert语句是否会转向核心数据,但是行为证明了这一点。它首先工作但在第二个视图上没有插入查询是触发器..

0 个答案:

没有答案