3

我的应用程序中有一个Tweetsheet共享选项。刚刚更新到 iOS8.3,现在SLComposeViewController当我尝试呈现时抛出错误Tweetsheet

“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'应用程序试图在目标上呈现一个零模式视图控制器”

SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:@"testing!"];
[self presentViewController:tweetSheet animated:YES completion:nil];

我正在事先检查 Twitter 是否可用。现在还有人有这个问题吗?

4

2 回答 2

2

SLServiceTypeTwitter在运行 iOS 8.3 的 iPhone 上使用时我遇到了同样的问题:虽然

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] 

返回YES,随后调用

[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]

返回nil。但是,如果我在 iPad 或 iPhone 模拟器上运行应用程序,或者将服务类型更改为SLServiceTypeFacebook.

现在我正在使用这个解决方法:为了检查 Twitter 的可用性,我使用

+(BOOL)twitterAvailable {
    return([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] &&
           [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter] != nil);
}

在展示 SLComposeViewController 之前,我进一步添加了一个额外的检查:

if(composeViewController != nil) {
   [viewController presentViewController:composeViewController animated:YES completion:nil];
}

这应该是 iOS 8.4 中错误修复的未来证明。

于 2015-04-29T12:01:27.797 回答
0

在使用其中一项服务之前,您始终应该检查是否可以访问该对象:

if( [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] ){

这真的很重要

  1. 您的应用程序没有崩溃并且
  2. 您可以告诉用户该服务不可用。

您应该对其他可以使用的服务执行相同的操作iOS,例如 forSMSMail

if(![MFMessageComposeViewController canSendText]) {

或者

if( ![MFMailComposeViewController canSendMail] ){

如果您想确定手机上有特定的应用程序,您也可以尝试使用canOpenURL:

- (BOOL)isAppAvailable:(NSString *)appURL{
   return [[UIApplication sharedApplication]  
                canOpenURL:[NSURL URLWithString:appURL]];
}

我认为这个电话isAvailableForServiceType:SLServiceTypeTwitter正在执行类似的事情。

于 2015-04-14T14:22:09.957 回答