尝试从另一个类提供视图控制器

时间:2015-08-13 04:44:44

标签: ios objective-c uiviewcontroller slcomposeviewcontroller

我正在开发一个允许用户通过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 个答案:

答案 0 :(得分:0)

问题是您正在创建一个名为“Main”的新视图控制器,并且该视图控制器未添加到应用程序的Windows层次结构中。

假设您的Facebook共享方法是在视图控制器类中实现的。你会打电话给

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

理想情况下,用户当前正在与之交互的视图控制器是您应该用来调用“presentViewController”的视图控制器。

如果您尝试在viewDidLoad()方法中显示视图控制器,则可以再次出现此问题。

答案 1 :(得分:0)

如果您将此代码写入当前向用户显示的控制器中,则不会出现任何错误。 presentViewController假设呈现另一个控制器的控制器已经在应用程序的UIWindow中有一个视图。

问题是MainRoot实际上本身从未呈现给用户,因此它没有资格通过自身呈现任何其他视图控制器

答案 2 :(得分:0)

根据你的陈述:

  

对于这个社交网络,我创建了一个包含此代码的分隔类

我们没有这个类的类型的信息,是UIViewController还是NSObject等?

由于UINavigationController无法在UIViewController访问,因此您无法向self.navigationController以外的类 [self.navigationController presentViewController:facebook animated:YES completion:nil]; 提供视图控件。

查看我的回答here

我使用装饰器设计模式将控件从类(比如UIView,UITableViewCell,NSObject等)转移到从UIViewController继承的类。然后你可以轻松打电话

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! 控制器是一个新分配的视图控制器,它从未被推送到导航堆栈,因此使用它来推送堆栈上的另一个视图控制器会引发此错误:

NSItemProvider(contentsOfURL: NSBundle.mainBundle().URLForResource("blockerList", withExtension: "json")

希望它有所帮助!

答案 3 :(得分:0)

如果要在MainRoot中显示另一个类的视图控制器,那么<​​/ p>

首先,你必须从self呈现MainRoot视图控制器,最重要的是你可以呈现你的SLComposeViewController。