谁的观点不在窗口层次结构问题中?

警告:尝试呈现其视图不在窗口层次结构中的视图!

是的,在发布这个问题之前,我已经看过其他问题和答案。 他们没有帮我解决这个问题。 这是我正在做的。 我打电话给我的单身类socialHelper显示一个操作表,其中postToFacebook方法是一个选项select。 当点击这个动作时,我得到了上面的警告,并且不显示postToFacebook 。 我从UIViewController调用这个UINavigationController作为主控制器,而我的SocialHelper类是一个NSOject

 - (void)postToFacebook { if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) { slComposeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; [slComposeViewController setInitialText:@"Building stairs? Checkout StairsPro on the app store!"]; [slComposeViewController addImage:[UIImage imageNamed:@"StairsIcon120x120.png"]]; [slComposeViewController addURL:[NSURL URLWithString:@"https://itunes.apple.com/us/app/stairs-pro/id477032819?ls=1&mt=8"]]; [self presentViewController:slComposeViewController animated:YES completion:nil]; // I've also tried this, which shows the post window, but after hitting cancel or post, my previous viewController is not the current viewController. So my navigation bar is gone and can't move around in my app. // [[[[UIApplication sharedApplication]delegate]window]setRootViewController:slComposeViewController]; }else{ UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"No Facebook Account" message:@"No Facebook account has been configured. You can configure or create a Facebook account in settings." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; [alert show]; } } 

所以我问的是在这种情况下获取slComposerViewController的最佳方式,以及我们如何使用UIApplication选项。 谢谢!

我会改变传递给ViewController的方法,以确保正确的VC呈现如下:

 - (void)postToFacebookFromVC:(UIViewController*) presentingVC 

而在调用presentViewController时使用该方法:

 [presentingVC presentViewController:slComposeViewController animated:YES completion:nil]; 

然后我假设使用你的socialHelper单例类将是这样的:

 [[socialHelper sharedResource] postToFacebookFromVC:self]; //inside the VC that you want to display it 

对于你使用rootViewController的第二个问题,试试这个:

 [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:slComposeViewController animated:YES completion:nil]; 

编辑:由于前两个build议没有为您的项目工作,尝试获取topMost ViewController并从它呈现slComposeViewController而不是“自我”像这样:

 UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; while (topController.presentedViewController) { topController = topController.presentedViewController; } [topController presentViewController:slComposeViewController animated:YES completion:nil]; 

这个答案不能解决你的问题,但是应该弄明白为什么它不能正常工作,并帮助你find你最初想要的解决scheme。

作为UIViewController SLComposeViewController具有关联的UIView ,它将显示在接收消息presentViewController的控制器的视图的顶部。

正如在这一行正确完成,但是, self需要是一个UIViewController (具有视图属性的对象)。

 [self presentViewController:slComposeViewController animated:YES completion:nil]; 

如果将-postToFaceBook方法移出SocialHelper类,并将其放入将显示操作表的UIViewController类(文件)中,则它将SocialHelper ,因此, self实际上是UIViewController而不是NSObject

从苹果的UIViewController参考页面 :

在UIViewController上调用presentViewController方法时,它将把presentViewController属性设置为指定的视图控制器,调整视图控制器视图的大小,然后将视图添加到视图层次结构中。

你的SocialHelper类不是一个视图控制器,所以它没有一个视图可以添加到操作表视图来显示它(在上面)。

我想即使你从UIViewControllerinheritance你的SocialHelper ,你的SocialHelper的视图不会在你的控制器的视图层次结构中。

如果只有两个或三个视图控制器需要显示操作表,我会复制代码而不是创build一个单独的类; 如果它是几个视图控制器,那么将行为表显示逻辑作为一个单独的类是有意义的,您只需要find正确的devise模式来做到这一点。

编辑1

忘了提及你的variables的声明是缺lessSLComposeViewController *

它只是在你的文章中丢失,或者你已经在viewcontroller类的其他地方声明了variables?

尝试在创buildSLComposeViewController的同一行中直接声明它; 这可能会解决这个问题。 如果这不起作用,那么通过查看这个非常简单易用的教程,仔细检查您所需要做的在您的应用中支持Facebook的所有步骤。

 SLComposeViewController *slComposeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; 

我假设你创build你的导航控制器的主视图控制器作为其根:

 navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController]; 

要显示另一面控制器,请在主视图控制器中执行此操作:

 [[self navigationController] pushViewController:flipSideViewController animated:NO]; 

轻触侧控制器具有约button以显示轻击时的关于视图; 我想你做一个presentViewController不是推:

 [self presentViewController:aboutViewController animated:YES]; 

最后,在关于视图控制器,你应该有你的-postToFacebook方法与上面提到的更正的行; 这将被日志(button?)调用。