presentViewController: animated: completion: всегда приводит к двум экземплярам представленного контроллера представления, это ошибка?

Я подключился к методам init, loadView, viewDidLoad, viewWillAppear :, viewDidAppear :, viewDidUnload и dealloc представленного контроллера представления, чтобы выйти из системы с соответствующей информацией о времени.

Но было обнаружено, что независимо от того, приведет ли presentModalViewController:animated: или presentViewController:animated:completion: к появлению двух экземпляров представленного контроллера представления, один из них вскоре будет уничтожен, и на экране ничего не появится (loadView и метод next еще не запущены).

Это ошибка или переход контроллера представления iOS работает именно так?

Вот информация журнала, WDIMMindItemEditViewController - это представленный контроллер представления, а WDIMMainScreenViewController - представляющий контроллер представления:

2012-09-29 16: 10: 02.615 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b5260>: контроллер представления редактирования будет инициализирован

2012-09-29 16: 10: 02.639 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b5260>: инициализированный контроллер представления редактирования

2012-09-29 16: 10: 02.641 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b94d0>: контроллер представления редактирования будет инициализирован

2012-09-29 16: 10: 02.645 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b94d0>: инициализированный контроллер представления редактирования

2012-09-29 16: 10: 02.835 ideaCal [23450: 707] ‹WDIMMainScreenViewController: 0x27c790> представит контроллер модального представления:‹ WDIMMindItemEditViewController: 0x2b5260>

2012-09-29 16: 10: 02.841 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b5260>: редактирование представления загрузки контроллера представления

2012-09-29 16: 10: 02.910 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b5260>: контроллер представления для редактирования загрузил представление

2012-09-29 16: 10: 02.912 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b5260>: появится представление контроллера представления редактирования

2012-09-29 16: 10: 03.297 ideaCal [23450: 707] ‹WDIMMainScreenViewController: 0x27c790> представит контроллер модального представления:‹ WDIMMindItemEditViewController: 0x2b94d0>

2012-09-29 16: 10: 03.302 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b94d0>: изменение контроллера представления будет освобождено

2012-09-29 16: 10: 03.340 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b94d0>: редактирование контроллера представления завершено dealloc

2012-09-29 16: 10: 03.702 ideaCal [23450: 707] ‹WDIMMindItemEditViewController: 0x2b5260>: появилось редактирование представления контроллера представления

2012-09-29 16: 10: 05.434 ideaCal [23450: 707] ‹WDIMMainScreenViewController: 0x27c790> завершил текущий контроллер модального представления:‹ WDIMMindItemEditViewController: 0x2b5260>

А вот мой код презентации:

- (IBAction)slidingMenuGetPressed:(WZUICircularPagingControlViewSlidingMenu *)slidingMenu event:(UIEvent *)event
{
    WDIMEditViewController * editModalViewController = nil;
    if ([slidingMenu.identifier isEqualToString:NEW_MIND_ITEM]) {
        editModalViewController = [[WDIMMindItemEditViewController alloc] init];
    }
    if ([slidingMenu.identifier isEqualToString:NEW_PROJECT]) {
        editModalViewController = [[WDIMMindItemEditViewController alloc] init];
    }
    if ([slidingMenu.identifier isEqualToString:NEW_TAG]) {
        editModalViewController = [[WDIMTagEditViewController alloc] init];
    }

    dispatch_queue_t snapshotQueue = dispatch_queue_create("com.WeZZardDesign.ScreenSnapshotQueue", NULL);
    dispatch_async(snapshotQueue, ^{
        UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
        [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage * snapshot = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        dispatch_async(dispatch_get_main_queue(), ^{
            editModalViewController.backgroundImage = snapshot;
            NSManagedObjectContext * workingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
            workingContext.parentContext = self.database.managedObjectContext;

            editModalViewController.preference = self.preference;
            editModalViewController.dataSource = self;
            editModalViewController.delegate = self;
            editModalViewController.workingContext = workingContext;

            NSLog(@"%@ will present modal view controller: %@", self, editModalViewController);
            [self presentViewController:editModalViewController animated:YES completion:^{
                NSLog(@"%@ ended present modal view controller: %@", self, editModalViewController);
            }];
        });
    });
    dispatch_release(snapshotQueue);
}

И у меня ничего не изменилось в presentModalViewController:animated: и presentViewController:animated:completion: методах.


person WeZZard    schedule 29.09.2012    source источник
comment
Похоже, что два экземпляра WDIMMindItemEditViewController инициализированы в slidingMenuGetPressed. Неужели NEW_MIND_ITEM и NEW_PROJECT - одинаковые строки? В этом случае будут выполнены два блока if.   -  person Martin R    schedule 29.09.2012
comment
Да, NEW_MIND_ITEM и NEW_PROJECT - это идентичные строки, но они не одинаковы. И не только два экземпляра WDIMMindItemEditViewController были выполнены, но и WDIMMainScreenViewController представили все, что один из них не вызвал блок завершения. Это странно. Думаю, мне следует создать чистый проект, чтобы восстановить ситуацию.   -  person WeZZard    schedule 29.09.2012
comment
1. isEqualToString: сравнивает содержимое строки, а не указатель. Итак, если NEW_MIND_ITEM и NEW_PROJECT - идентичные строки, то будут выполнены два блока if. Вы должны проверить это, установив точку останова в отладчике. - 2. представит модальный контроллер представления ... отображается дважды в выводе NSLog, что означает, что slidingMenuGetPressed был вызван дважды.   -  person Martin R    schedule 29.09.2012
comment
Спасибо! Проблема решена! Ваша логика строже моей.   -  person WeZZard    schedule 29.09.2012
comment
Добро пожаловать. Я добавил свои комментарии в качестве официального ответа, и вы можете принять его, щелкнув контур галочки слева от ответа. Это удалит этот вопрос из списка неотвеченных вопросов. Спасибо.   -  person Martin R    schedule 30.09.2012
comment
Я сделал это. И настоящая причина в том, что slidingMenuGetPressed вызвали дважды. Это было вызвано программной отправкой метода sendActionsForEvents: классу на основе UIControl в цикле. И я неправильно обработал поток управления внутри этого цикла.   -  person WeZZard    schedule 30.09.2012


Ответы (1)


Из комментариев выше стало ясно, что NEW_MIND_ITEM и NEW_PROJECT - это две строки с одинаковым содержанием. Поскольку isEqualToString сравнивает содержимое, а не указатель, выполняются два блока «если», создавая два экземпляра WDIMMindItemEditViewController. Использование разных строк должно решить проблему.

person Martin R    schedule 30.09.2012