Как отклонить eventeditviewcontroller, когда я разрешил редактирование в eventviewcontroller?

#ios #objective-c #viewcontroller #dismiss #ekevent

#iOS #objective-c #viewcontroller #отклонить #ekevent

Вопрос:

Итак, я представляю EKEventViewController с UINavigationController. Изнутри EKEventViewController я могу редактировать событие. Он представляет EKEventEditViewController. Все работает отлично (кнопки отмена / готово), за исключением случаев, когда я удаляю событие внутри EKEventEditViewController, я получаю это

попытка отклонить контроллер модального представления, представление которого в данный момент не отображается. self = modalViewController =

Вот мой код…

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [CalendarViewController connectExchange];

    if (connectionEx == YES)
    {
        NSDate *dateRepresentingThisDay = [self.sortedDays objectAtIndex:indexPath.section];
        NSArray *eventsOnThisDay = [self.sections objectForKey:dateRepresentingThisDay];
        EKEventViewController *eventViewController = [[EKEventViewController alloc] init];

        eventViewController.allowsEditing = YES;
        eventViewController.delegate = self;
        EKEvent *event = [eventsOnThisDay objectAtIndex:indexPath.row];
        eventViewController.event = event;

        UINavigationController *navBar = [[UINavigationController alloc]initWithRootViewController:eventViewController];

        [self.navigationController presentViewController:navBar animated:YES completion:nil];
    }
}

- (void)eventViewController:(EKEventViewController *)controller didCompleteWithAction:(EKEventViewAction)action
{
    EKEvent *event = controller.event;

    CalendarViewController * __weak weakSelf = self;
    // Dismiss the modal view controller
    [self dismissViewControllerAnimated:YES completion:^
    {
        if (action == EKEventViewActionDone)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
               NSError *err;
               [self.eventStore saveEvent:event span:EKSpanThisEvent error:amp;err];
               [self updateEvent:event];
            });
        }
        if (action == EKEventViewActionDeleted)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
               [self deleteEvent:event];
               NSError *error;
               EKEvent *eventRemove = [self.eventStore eventWithIdentifier:event.eventIdentifier];
               [self.eventStore removeEvent:eventRemove span:EKSpanThisEvent error:amp;error];
            });
        }
        if (action == EKEventViewActionResponded)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
            });
        }

     weakSelf.eventsList = [self fetchEvents];
     [weakSelf.tableView reloadData];
     NSLog(@"Event Updated");
     }];
}
 

Как я полагаю, правильно отключить ViewControllers после удаления события с помощью EKEventEditViewController?

Ответ №1:

Я решил свою проблему, создав подкласс EKEventViewController и настроив EKEventEditViewDelegate и EKEventViewDelegate.

Вот мой измененный didSelectRow(CalendarViewController.m),

     EditViewController *eventViewController = [[EditViewController alloc] init];

    eventViewController.allowsEditing = YES;
    eventViewController.delegate = self;
    EKEvent *event = [eventsOnThisDay objectAtIndex:indexPath.row];
    eventViewController.event = event;

    [self.navigationController pushViewController:eventViewController animated:YES];
    self.editingEvent = eventViewController.event;
 

EditViewController является моим подклассом EKEventViewController.

В подклассе (EditViewController.m) я добавил свою собственную кнопку редактирования с селектором в viewDidLoad,

 - (void)viewDidLoad
{
    [super viewDidLoad];
    UIBarButtonItem *editItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self.delegate action:@selector(editCalEvent)];
    self.navigationItem.rightBarButtonItem = editItem;
}
 

Теперь снова в CalendarViewController.m после добавления EKEventEditViewDelegate и EKEventViewDelegate в @interface я добавил новые методы

 - (void)editCalEvent
{

     EKEventEditViewController *editController = [[EKEventEditViewController alloc] init];

     editController.event = self.editingEvent;
     editController.eventStore = self.eventStore;
     editController.editViewDelegate = self;

     [self presentViewController:editController animated:YES completion:nil];

}

- (void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction (EKEventEditViewAction)action
{
     EKEvent *thisEvent = controller.event;

     [self dismissViewControllerAnimated:NO completion:^
     {
         switch (action)
         {
             {case EKEventEditViewActionCanceled:
                //NSLog(@"Canceled action");
                break;}

             {case EKEventEditViewActionSaved:
                [self.eventStore saveEvent:thisEvent span:EKSpanThisEvent error:nil];
                [self updateEvent:thisEvent];
                break;}
             {case EKEventEditViewActionDeleted:
                [self deleteEvent:thisEvent];
                NSError *error;
                EKEvent *eventRemove = [self.eventStore eventWithIdentifier:thisEvent.eventIdentifier];
                [self.eventStore removeEvent:eventRemove span:EKSpanThisEvent error:amp;error];
                //NSLog(@"Deleted action");
                break;}
             {default:
                break;}
         }
     }];
}

- (void)eventViewController:(EKEventViewController *)controller didCompleteWithAction:(EKEventViewAction)action
{

}
 

Ответ №2:

Используйте editViewDelegate вместо delegate .