Попытка представить контроллер представления из другого класса

Я занимаюсь разработкой приложения, которое позволяет пользователям делиться через 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().

Другие вопросы по тегам