Попытка представить контроллер представления из другого класса
Я занимаюсь разработкой приложения, которое позволяет пользователям делиться через Facebook,Twitter и электронную почту.
Для этой социальной сети я создал отдельный класс, который содержит этот код:
-(void)Facebooksharing
{
SLComposeViewController *facebook = [[SLComposeViewController alloc] init];
facebook = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
[facebook setInitialText:@"Hello"];
[facebook setTitle:@"Helle"];
ViewController *MainRoot = [[ViewController alloc] init];
[MainRoot presentViewController:facebook animated:YES completion:nil];
}
Всякий раз, когда я вызываю эту функцию, я получаю эту ошибку:
Warning: Attempt to present <SLComposeViewController: 0x7ffc5afe70e0> on <ViewController: 0x7ffc5af57a60> whose view is not in the window hierarchy!
Кто-нибудь может мне помочь, пожалуйста, как я могу представить эту точку зрения из другого класса?
4 ответа
Если вы напишите этот код в контроллере, который в данный момент показывается пользователю, вы не получите никакой ошибки. presentViewController
предполагается, что контроллер, который представляет другой контроллер, уже имеет представление в UIWindow приложения.
проблема заключается в MainRoot
фактически сам никогда не представляется пользователю и, следовательно, он не имеет права представлять любой другой контроллер представления через себя
Согласно вашему заявлению:
Для этой социальной сети я создал отдельный класс, содержащий этот код
У нас нет информации о типе этого класса, UIViewController или NSObject и т. Д.?
Решено, что вы не можете представить viewcontroller UINavigationController
из класса, кроме UIViewController
поскольку self.navigationController
там не доступно.
Посмотрите на мой ответ здесь.
Я использовал шаблон проектирования декоратора для передачи элемента управления из класса (скажем, UIView, UITableViewCell, NSObject и т. Д.) В класс, который наследуется от UIViewController. Тогда вы можете легко позвонить
[self.navigationController presentViewController:facebook animated:YES completion:nil];
В этой же ссылке вы найдете другой ответ, который поможет представить viewcontroller в окне. Вы также можете попробовать.
Относительно проблемы, которую вы на самом деле имеете, здесь:
ViewController *MainRoot = [[ViewController alloc] init];
[MainRoot presentViewController:facebook animated:YES completion:nil];
Вот, MainRoot
контроллер - это недавно выделенный viewcontroller, и он никогда не передавался в стек навигации, поэтому использование этого для помещения другого viewcontroller в стек вызывает эту ошибку:
Warning: Attempt to present <SLComposeViewController: 0x7ffc5afe70e0> on <ViewController: 0x7ffc5af57a60> whose view is not in the window hierarchy!
Надеюсь, поможет!
Если вы хотите представить контроллер представления из другого класса в MainRoot, то
Сначала вы должны представить контроллер представления MainRoot от самого себя, и, кроме того, вы можете представить свой SLComposeViewController.
Проблема в том, что вы создаете новый контроллер представления с именем "Main", и этот контроллер представления не добавляется в иерархию окон вашего приложения.
Предполагая, что ваш метод Facebooksharing реализован внутри класса контроллера представления. Вы бы позвонили
[self presentViewController:facebook animated:YES completion:nil]
В идеале контроллер представления, с которым в данный момент взаимодействует пользователь, должен использоваться для вызова "presentViewController".
В другой раз эта проблема может возникнуть, если вы попытаетесь представить контроллер представления внутри метода viewDidLoad().