"Програма намагалася представити активний контролер"?


100

Я щойно зіткнувся з аварією, яка показувала NSInvalidArgumentExceptionце повідомлення в додатку, яке раніше цього не робило.

Програма намагалася представити модально активний контролер UITabBarController: 0x83d7f00.

У мене є те, UITabBarControllerщо я створюю в AppDelegateі надаю йому масив UIViewControllers.

Один з них я хочу представити модально, коли натискаєте на нього. Я зробив це, застосувавши метод делегата

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController

Якщо цей контролер перегляду є класом того, якого я хочу представити модально, я повертаю НЕ і роблю

[tabBarController presentModalViewController:viewController animated:YES];

І тепер я отримую цю помилку, яка, мабуть, означає, що ви не можете представити модально контролер перегляду, який активний десь в іншому місці (на панелі вкладок ...), я повинен сказати, що я перебуваю на XCode 4.2 Developer Preview 7, так це iOS 5 (я знаю про NDA, але, думаю, я не даю заборонених деталей). На даний момент у мене немає встановлення XCode, щоб перевірити, чи не вдалося це зібрати компіляцію проти iOS4 SDK, але я майже повністю впевнений, що цього немає.

Я хотів лише запитати, чи не стикався хтось із цим питанням чи має якісь пропозиції


До iOS 5 це не спричинило винятку, але нічого не повернуло. З iOS 5 ця команда створює виняток.
Фредерік Адда

Відповіді:


103

Припустимо, у вас є три контролери подання, такі як такі:

UIViewController* vc1 = [[UIViewController alloc] init];
UIViewController* vc2 = [[UIViewController alloc] init];
UIViewController* vc3 = [[UIViewController alloc] init];

Ви додали їх до рядка вкладок так:

UITabBarController* tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:vc1, vc2, vc3, nil]];

Тепер ви намагаєтесь зробити щось подібне:

[tabBarController presentModalViewController:vc3];

Це призведе до помилки, оскільки контролер панелі вкладок має загибель на контролері перегляду, який ви йому надали. Ви можете або не додати його до масиву контролерів перегляду на панелі вкладок, або ви не можете його представити модально.

Apple очікує, що ви поводитесь з їх елементами інтерфейсу певним чином. Це, мабуть, десь поховано в Посібниках щодо людського інтерфейсу як "не роби цього, тому що ми не очікуємо, що ти колись захочеш цього робити".


6
Справа в тому, що до iOS 5 це абсолютно не було проблем, отже, моя стурбованість! Що я зробив, це додати манекен UIViewController на панель вкладок і представити модально фактичний екземпляр підкласи контролера перегляду.
Хав'єр Сото

1
@Iswank, тепер в iOS 6, щоб зробити це "простішим", вони застаріли, теперішнійModalViewController спричиняє всілякі проблеми з обертанням. Вам потрібно використовувати presentViewController: анімовані: завершення та перевірити, як ваша програма обробляє зміни
whyoz

15

У мене така ж проблема. Я намагаюся представити контролер перегляду відразу після відхилення.

[self dismissModalViewControllerAnimated:YES];

Коли я намагаюся зробити це без анімації, він працює чудово, тому проблема полягає в тому, що контролер все ще живий. Я думаю, що найкращим рішенням є використання dismissViewControllerAnimated:completion:для iOS5


Він не вдається, якщо ви відхилили його анімованим, оскільки до моменту, коли ви хочете знову представити контролер модального перегляду, він все ще залишається на екрані, анімуючи його.
Паскаль

2
Оприлюднено в IOS 6.0
Суміт Кумар Саха

12

У моєму випадку я намагався представити viewController (у мене є посилання viewController в TabBarViewController) від різних контролерів перегляду, і це було збоєм з вищезгаданим повідомленням. У такому випадку, щоб уникнути презентації, ви можете використовувати

viewController.isBeingPresented

!viewController.isBeingPresented {
          // Present your ViewController only if its not present to the user currently.
}

Може допомогти комусь.


він працює лише у viewWillappperar, але коли я перевіряю його перед тим, як представити viewController, який вже представлений, він завжди повертається помилковим.
гуру

1
Не працює для мене. Досі виходить з ладу програми. (! viewController.presentingViewController) вирішено проблему.
Аргус

3

У мене була така ж проблема. Я її вирішую. Ви можете спробувати цей код:

[tabBarController setSelectedIndex:1];
[self dismissModalViewControllerAnimated:YES];

2

Ця ж помилка проблеми трапилася і зі мною, коли я спробував presentконтролер дочірнього перегляду замість UINavigationViewControllerбатьківського


0

Просто видаліть

[tabBarController presentModalViewController:viewController animated:YES];

і тримати

[self dismissModalViewControllerAnimated:YES];

це дає застаріле попередження ... так що це альтернативне?
Кіртікумар А.

Тут я використав [blockSelf dismissViewControllerAnimated: YES завершення: нуль];
Кіртікумар А.

0

Замість використання:

self.present(viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?)

Ви можете використовувати:

self.navigationController?.pushViewController(viewController: UIViewController, animated: Bool)

0

У моєму випадку, я пред'явлення rootViewControllerз , UINavigationControllerколи я повинен був уявляю UINavigationControllerсебе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.