SpriteKit 分享按钮不起作用

Posted

技术标签:

【中文标题】SpriteKit 分享按钮不起作用【英文标题】:SpriteKit share button not working 【发布时间】:2015-06-09 17:25:03 【问题描述】:

我在尝试制作一个允许用户在社交媒体网站上分享我的游戏的分享按钮时遇到了很多困难。我正在使用 Sprite Kit 开发游戏。从我所见,我的印象是启动共享视图控制器的实际代码必须在我的 GameViewController 类下。因此,我有一个在 gameScene 类中初始化的按钮,当按下它时会运行一个创建 gameViewController 类实例的方法,然后运行 ​​shareGame 方法。这是我的代码,感谢您的帮助,因为我真的迷路了。

在我的gameScene类中(这个方法在按钮被按下时运行)

-(IBAction)runShareGame:(id)sender
   GameViewController *myViewController = [[GameViewController alloc] init];
   [myViewController shareGame];

并且这段代码在gameViewController.m类中(注意shareGame方法包含在接口中)

-(void)shareGame
   NSLog(@"shareGame!");
   NSString *message = @"Hello World!";
   UIImage *imageToShare = [UIImage imageNamed:@"blue"];
   NSArray *postItems = @[message, imageToShare];
   UIActivityViewController *activityVC = [[UIActivityViewController alloc]
                                        initWithActivityItems:postItems
                                        applicationActivities:nil];
   [self presentViewController:activityVC animated:YES completion:nil];

当我运行代码时,我在控制台中收到以下消息:

分享游戏!

2015-06-06 17:01:27.626 Dodge[96002:3651805] -[UIView setShowsFPS:]: unrecognized selector sent to instance 0x7a8c88b0
2015-06-06 17:01:27.630 Dodge[96002:3651805] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setShowsFPS:]: unrecognized selector sent to instance 0x7a8c88b0'
First throw call stack:
(
    0   CoreFoundation                      0x00966746 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x005efa97 objc_exception_throw + 44
    2   CoreFoundation                      0x0096e705 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277
    3   CoreFoundation                      0x008b5287 ___forwarding___ + 1047
    4   CoreFoundation                      0x008b4e4e _CF_forwarding_prep_0 + 14
    5   Dodge                               0x000fb48b -[GameViewController viewDidLoad] + 139
    6   UIKit                               0x0127cda4 -[UIViewController loadViewIfRequired] + 771
    7   UIKit                               0x0127d095 -[UIViewController view] + 35
    8   UIKit                               0x0125784d -[UIPresentationController __sizeClassPair] + 54
    9   UIKit                               0x0128a7a3 -[UIViewController _presentViewController:withAnimationController:completion:] + 2349
    10  UIKit                               0x0128d382 __62-[UIViewController presentViewController:animated:completion:]_block_invoke + 345
    11  UIKit                               0x0128d1d4 -[UIViewController presentViewController:animated:completion:] + 224
    12  Dodge                               0x000fb817 -[GameViewController shareGame] + 327
    13  Dodge                               0x00107871 -[GameScene runShareGame:] + 129
    14  libobjc.A.dylib                     0x006057cd -[NSObject performSelector:withObject:withObject:] + 84
    15  UIKit                               0x01119a90 -[UIApplication sendAction:to:from:forEvent:] + 99
    16  UIKit                               0x01119a22 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 64
    17  UIKit                               0x0125a18a -[UIControl sendAction:to:forEvent:] + 69
    18  UIKit                               0x0125a5a7 -[UIControl _sendActionsForEvents:withEvent:] + 598
    19  UIKit                               0x01259811 -[UIControl touchesEnded:withEvent:] + 660
    20  UIKit                               0x01171cfa -[UIWindow _sendTouchesForEvent:] + 874
    21  UIKit                               0x011727d6 -[UIWindow sendEvent:] + 792
    22  UIKit                               0x011306d1 -[UIApplication sendEvent:] + 242
    23  UIKit                               0x01140b08 _UIApplicationHandleEventFromQueueEvent + 21484
    24  UIKit                               0x01114337 _UIApplicationHandleEventQueue + 2300
    25  CoreFoundation                      0x0088806f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    26  CoreFoundation                      0x0087db7d __CFRunLoopDoSources0 + 253
    27  CoreFoundation                      0x0087d0d8 __CFRunLoopRun + 952
    28  CoreFoundation                      0x0087ca5b CFRunLoopRunSpecific + 443
    29  CoreFoundation                      0x0087c88b CFRunLoopRunInMode + 123
    30  GraphicsServices                    0x03d3d2c9 GSEventRunModal + 192
    31  GraphicsServices                    0x03d3d106 GSEventRun + 104
    32  UIKit                               0x01118106 UIApplicationMain + 1526
    33  Dodge                               0x00107e7a main + 138
    34  libdyld.dylib                       0x030e5ac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

【问题讨论】:

根据错误,您似乎不是在 SKView 上调用 setShowsFPS?也看看这个问题:***.com/q/17685769/2158465 【参考方案1】:

我认为问题在于您正在创建一个 GameViewController,并且因为您这样做它会崩溃。看起来它与找不到 SKView 的事实有关,因为它不是从情节提要中加载的。

话虽如此,您不想使用当前的新 GameViewController。有几种方法可以解决这个问题。最简单的可能是这样...

-(IBAction)runShareGame:(id)sender

    UIViewController *vc = self.view.window.rootViewController;

    if ([vc isKindOfClass:[GameViewController class]])
    
        GameViewController *myViewController = (GameViewController *)vc;
        [myViewController shareGame];
    

但是,如果您使用的是导航控制器或类似的东西,您可能无法取回 GameViewController 而是获取 UINavigationController。

最好的方法是创建一个委托并在您创建场景时分配它。这个问题对你想要做的事情有很多不同的方法。 How do I present a UIViewController from SKScene? 但是您的应用程序崩溃了,因为您正在重新创建 GameViewController 这使您的问题有点不同。有人确实提到了委托方法,但您将在 Scene 而不是视图控制器上创建协议。

编辑

https://***.com/a/21917919/851041

这里很好地使用了委托来与您的视图控制器进行通信。

希望这会有所帮助。

【讨论】:

非常感谢,您提供的修改后的 runShareGame 方法完美运行!非常感谢您的帮助!

以上是关于SpriteKit 分享按钮不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我的部分动画在 SpriteKit 中不起作用

SpriteKit SKTexture mipmap 不起作用

SpriteKit横向不起作用

SpriteKit中的加速度计不起作用

SpriteKit 碰撞检测不起作用

iOS Spritekit - SKSpriteNode .centerRect 属性不起作用