私の状況を正しく説明しようとします。
2ビューになりました。私の最初のビューで、イベントをリストするテーブルを取得しました。セルに触れると、EventOverviewView を取得します。だから私は各ビューで異なる動作をしています:
FirstView (イベントのリスト):
セルの 1 つを長押しすると、UIActionSheet が表示されます。そのイベントに参加したいと言うことができますが、シートが表示される前に、選択したイベントを配列から取得し、一時変数に保存します。ですから、その見方では、私は何の問題もありません。すべてが正しく保存されています (SQLite ブラウザーで確認できます)。
しかし、前に言ったように、イベントに参加するかどうかを決定する前にイベントを見たいと言うことができます。この時点で、前述のEventOverviewViewにプッシュします (イベント オブジェクトはプロパティとして設定され、nil ではありません。テストしました)。このビューでも、参加したい場合は決定できます。ここで私の問題があります(イベントへのユーザーの追加を処理する次のメソッド)。
-(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;
}
}
}
最後になりましたが、 add メソッド:
- (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;
}
なぜ同じ方法が私の最初のビューでは機能しているのに、2番目のビューでは機能していないのか、本当に混乱しています。正しく説明できることを本当に願っています。すでにアドバイスを求めています!
EDIT 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 ステートメントがコア データに送信されるかどうかを確認しましたが、動作が証明されているようです。それは最初に動作しますが、2番目のビューでは挿入クエリはトリガーされません..