【问题标题】:skscene UIViewController send SMS from SKSceneskscene UIViewController 从 SKScene 发送短信
【发布时间】:2014-03-23 00:13:37
【问题描述】:

我正在尝试让玩家在游戏结束时通过短信分享他们的分数。

我已将框架导入到我的项目中。在我的 viewController.h 文件中导入。

这是我的 viewController.h 文件

#import <UIKit/UIKit.h>
#import <SpriteKit/SpriteKit.h>
#import <MessageUI/MessageUI.h>


@interface myViewController : UIViewController <MFMessageComposeViewControllerDelegate> {
}

@end

我也尝试像这样导入 MyScene.h:

#import <MessageUI/MessageUI.h>

@interface MyScene : SKScene <MFMessageComposeViewControllerDelegate> {

}

当我想显示 SMS 共享时,我在 MyScene.m 文件中使用此代码

MFMessageComposeViewController *textComposer = [[MFMessageComposeViewController alloc] init];
[textComposer setMessageComposeDelegate:self];

if ([MFMessageComposeViewController canSendText]) {
    [textComposer setRecipients:[NSArray arrayWithObject:nil]];
    [textComposer setBody:@"Happy Happy Joy Joy!"];
    [self presentViewController:textComposer animated:YES completion:NULL];

} else {
    NSLog(@"Cant send text!");
}

但是在这一行

[self presentViewController:textComposer animated:YES completion:NULL];

我收到“'MyScene' 没有可见的@interface 声明选择器'presentViewController:animated:completion:'”错误。

我试图搜索过去几个小时。试试上帝知道其他帖子/教程中有多少变化和示例(学习一些与此无关的东西很好)。似乎没有什么工作。我开始用完头发拔掉。所以任何帮助都会很棒。我相信对于你们中的一些大师来说,这应该是在公园里散步。谢谢。

编辑:我没有使用故事板,或用于按钮/菜单/游戏等的视图控制器......因此我无法从 viewController 本身调用该函数。

编辑: 所以我尝试了 Paulw11 在他的链接中建议的内容。现在我有以下错误。

在我的视图控制器中

    MyScene.MyViewController = self;

我收到“在 'MyScene' 类型的对象上找不到属性 'MyViewController'”错误

也在 MyScene.m 中

- (void)sendToController
{
     NSLog(@"ok");
    // use the already-created spriteViewController
    [_MyViewController sendSMS];
}

[_MyViewController 发送短信];行我得到一个“'MyViewController'没有可见的@interface声明选择器'SendSMS'”

编辑 2: *编辑 2:* 编辑 2: *编辑 2:*

我得到它来打开短信。小问题,它不允许我关闭它/取消。

这是我的发送短信代码:

 -(void) sendSMS {

MFMessageComposeViewController *textComposer = [[MFMessageComposeViewController alloc] init];
[textComposer setMessageComposeDelegate:self];

if ([MFMessageComposeViewController canSendText]) {
    [textComposer setRecipients:[NSArray arrayWithObject:@" "]];

    NSString *body = [NSString stringWithFormat:@"Happy Day!: %i.   ", _score];
    [textComposer setBody:body];

    UIViewController *vc = self.view.window.rootViewController;
    [vc presentViewController: textComposer animated: YES completion:nil];

} else {
    NSLog(@"Cant send text!");
}
}

这是我的关闭代码:

-(void)messageComposeViewController:(MFMessageComposeViewController *)controller   didFinishWithResult:(MessageComposeResult)result {

    UIViewController *vc = self.view.window.rootViewController;
    [vc dismissViewControllerAnimated:YES completion:NULL];

}

编辑 3

以下代码在正确的时间为我提供了 NSLog,但不会关闭窗口。

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
             didFinishWithResult:(MessageComposeResult)result
{
    UIViewController *vc = self.view.window.rootViewController;

// Notifies users about errors associated with the interface
switch (result)
{
    case MessageComposeResultCancelled:
       NSLog(@"Result: SMS sending canceled");
        break;
    case MessageComposeResultSent:
        NSLog(@"Result: SMS sent");
        break;
    case MessageComposeResultFailed:
        NSLog(@"Result: SMS sending failed");
        break;
    default:
        NSLog(@"Result: SMS not sent");
        break;
}

[vc dismissViewControllerAnimated:YES completion:NULL];
}

【问题讨论】:

  • 问题是您在SKScene 上调用presentViewController,而不是在UIViewController 上。您的应用程序中必须有一个根视图控制器。您需要获取对它的引用并使用它来呈现 textComposer 控制器。
  • @Paulw11 感谢您的链接,我试过了,建议什么。但没有运气。如何从我的 SKScene 中引用我的视图控制器?
  • 您的 SKScene 中的 self.view.window.rootViewController 是否为非 nil ?你的 appDelegate.window.rootViewController 呢?
  • @Paulw11 请在我的问题中查看我的编辑。

标签: ios uiviewcontroller sms sprite-kit skscene


【解决方案1】:

如果您引用MFMessageComposeViewController Class Reference,您将看到您需要使用presentModalViewController:animated: 以模态方式呈现它。完成后,您还有责任通过您的 delegate 对象将其关闭。

我建议您查看 Message Composer sample code 以获取使用 MFMessageComposeViewController 类的示例。

更新

您可以关闭传递给您的委托方法的视图控制器 -

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
         didFinishWithResult:(MessageComposeResult)result
{

// Notifies users about errors associated with the interface
switch (result)
{
    case MessageComposeResultCancelled:
       NSLog(@"Result: SMS sending canceled");
    break;
    case MessageComposeResultSent:
        NSLog(@"Result: SMS sent");
    break;
    case MessageComposeResultFailed:
        NSLog(@"Result: SMS sending failed");
    break;
    default:
        NSLog(@"Result: SMS not sent");
    break;
}

[controller dismissViewControllerAnimated:YES completion:NULL];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多