Я подключился к методам 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:
методах.
WDIMMindItemEditViewController
инициализированы вslidingMenuGetPressed
. НеужелиNEW_MIND_ITEM
иNEW_PROJECT
- одинаковые строки? В этом случае будут выполнены два блока if. - person Martin R   schedule 29.09.2012NEW_MIND_ITEM
иNEW_PROJECT
- это идентичные строки, но они не одинаковы. И не только два экземпляраWDIMMindItemEditViewController
были выполнены, но иWDIMMainScreenViewController
представили все, что один из них не вызвал блок завершения. Это странно. Думаю, мне следует создать чистый проект, чтобы восстановить ситуацию. - person WeZZard   schedule 29.09.2012isEqualToString:
сравнивает содержимое строки, а не указатель. Итак, если NEW_MIND_ITEM и NEW_PROJECT - идентичные строки, то будут выполнены два блока if. Вы должны проверить это, установив точку останова в отладчике. - 2. представит модальный контроллер представления ... отображается дважды в выводе NSLog, что означает, чтоslidingMenuGetPressed
был вызван дважды. - person Martin R   schedule 29.09.2012slidingMenuGetPressed
вызвали дважды. Это было вызвано программной отправкой метода sendActionsForEvents: классу на основе UIControl в цикле. И я неправильно обработал поток управления внутри этого цикла. - person WeZZard   schedule 30.09.2012