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

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

Кто-нибудь может помочь мне, пожалуйста, как я могу представить это представление из другого класса?


person Ahmed jamal    schedule 13.08.2015    source источник
comment
Может быть, вам стоит попробовать это: [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:facebook animated:YES completion:nil];   -  person Bannings    schedule 13.08.2015


Ответы (4)


Проблема в том, что вы создаете новый контроллер представления под названием «Основной», и этот контроллер представления не добавляется в иерархию окон вашего приложения.

Предполагая, что ваш метод Facebooksharing реализован внутри класса контроллера представления. Вы бы позвонили

[self presentViewController:facebook animated:YES completion:nil]

В идеале контроллер представления, с которым в данный момент взаимодействует пользователь, — это тот, который вы должны использовать для вызова «presentViewController».

В другой раз эта проблема может возникнуть, если вы попытаетесь представить контроллер представления внутри метода viewDidLoad().

person M.Scherzer    schedule 13.08.2015

если вы напишете этот код в контроллере, который в данный момент показывается пользователю, вы не получите никакой ошибки. presentViewController предполагает, что контроллер, представляющий другой контроллер, уже имеет представление в UIWindow приложения.

проблема в том, что MainRoot на самом деле никогда не представляется пользователю и, следовательно, он не имеет права представлять какой-либо другой контроллер представления через себя

person Saurabh Passolia    schedule 13.08.2015
comment
Итак, как я могу представить контроллер представления из другого класса в MainRoot - person Ahmed jamal; 13.08.2015

Согласно вашему утверждению:

Для этой социальной сети я создал отдельный класс, содержащий этот код

У нас нет информации о типе этого класса, это UIViewController или NSObject и т. д.?

Решено, что нельзя предъявлять вьюконтроллеру UINavigationController из класса, отличного от UIViewController, так как self.navigationController там недоступен.

Посмотрите мой ответ здесь.

Я использовал шаблон проектирования декоратора для передачи управления из класса (скажем, UIView, UITableViewCell, NSObject и т. д.) в класс, унаследованный от UIViewController. Тогда вы можете легко позвонить

   [self.navigationController presentViewController:facebook animated:YES completion:nil];

В той же ссылке вы найдете еще один ответ, который поможет представить контроллер представления в окне. Вы тоже можете попробовать.

Что касается проблемы, с которой вы на самом деле сталкиваетесь, здесь:

ViewController *MainRoot = [[ViewController alloc] init];
[MainRoot presentViewController:facebook animated:YES completion:nil];

Здесь контроллер MainRoot — это недавно выделенный контроллер представления, и он никогда не помещался в стек навигации, поэтому использование его для помещения другого контроллера представления в стек вызывает эту ошибку:

Warning: Attempt to present <SLComposeViewController: 0x7ffc5afe70e0> on <ViewController: 0x7ffc5af57a60> whose view is not in the window hierarchy!

Надеюсь, поможет!

person NeverHopeless    schedule 13.08.2015

Если вы хотите представить контроллер представления из другого класса в MainRoot, то

Сначала вы должны представить контроллер представления MainRoot из self , и, кроме того, вы можете представить свой SLComposeViewController.

person Vikas Dadheech    schedule 13.08.2015