iOS game crashes after pressing Share button only on iPad

这一生的挚爱 提交于 2019-12-23 07:07:07

问题


My iOS game crashes after the share button is pressed. This button then gives the users the option to post/send a pre-written text line and a link to the app to Twitter, FB, Mail, Messages,etc. I am able to replicate the crash on the all iPad simulators running iOS 8.2.

Here is the symbolicated crash report: https://www.dropbox.com/s/yyo4ouniegt6s0e/dotSports.crash?dl=0

In addition: This is from the output box in Xcode when taking the actions to produce the crash.

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7a863100>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.'
*** First throw call stack:
(
    0   CoreFoundation                      0x04980466 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x03caea97 objc_exception_throw + 44
    2   UIKit                               0x02564517 -[UIPopoverPresentationController presentationTransitionWillBegin] + 3086
    3   UIKit                               0x01e63f48 __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke + 1666
    4   UIKit                               0x01e624eb __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 186
    5   UIKit                               0x01e9642b __40+[UIViewController _scheduleTransition:]_block_invoke + 18
    6   UIKit                               0x01d5b946 ___afterCACommitHandler_block_invoke + 15
    7   UIKit                               0x01d5b8f1 _applyBlockToCFArrayCopiedToStack + 415
    8   UIKit                               0x01d5b706 _afterCACommitHandler + 545
    9   CoreFoundation                      0x048a318e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
    10  CoreFoundation                      0x048a30d0 __CFRunLoopDoObservers + 400
    11  CoreFoundation                      0x04898b0a __CFRunLoopRun + 1226
    12  CoreFoundation                      0x0489837b CFRunLoopRunSpecific + 443
    13  CoreFoundation                      0x048981ab CFRunLoopRunInMode + 123
    14  GraphicsServices                    0x0524d2c1 GSEventRunModal + 192
    15  GraphicsServices                    0x0524d0fe GSEventRun + 104
    16  UIKit                               0x01d319b6 UIApplicationMain + 1526
    17  Gem Dots copy                       0x00213896 main + 134
    18  libdyld.dylib                       0x04365ac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)  

Here is the code that it crashes at:

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
    [pool release];
    return retVal;
}

Here is the code for the share button:

-(void) displayShare:(NSString*)strText imageIdx:(int)nIdx URL:(NSString*)strURL
{
    UIActivityViewController *activityView;

    if(nIdx >= 0)
    {
        NSString* str = [NSString stringWithFormat:@"new-arc-%d-ipad.png", nIdx+1];
        UIImage* image = [UIImage imageNamed:str];
        activityView = [[UIActivityViewController alloc] initWithActivityItems:@[strText, image, [NSURL URLWithString:strURL]] applicationActivities:nil];
    }
    else
        activityView = [[UIActivityViewController alloc] initWithActivityItems:@[strText, [NSURL URLWithString:strURL]] applicationActivities:nil];

    activityView.excludedActivityTypes = @[UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypePrint];

   // [viewController presentViewController:activityView animated:YES completion:nil];
    [window.rootViewController presentViewController:activityView animated:YES completion:nil];

    [activityView setCompletionHandler:^(NSString *activityType, BOOL completed) {
        NSLog(@"completed dialog - activity: %@ - finished flag: %d", activityType, completed);

        if(completed)
        {
            if([activityType isEqualToString: @"com.apple.UIKit.activity.PostToFacebook"] )
            {
                g_bArchiveMark[19] = true;
                AppSettings::setArchieveInfo(19);
            }
            else if([activityType isEqualToString: @"com.apple.UIKit.activity.PostToTwitter"] )
            {
                g_bArchiveMark[20] = true;
                AppSettings::setArchieveInfo(20);

            }
        }
    }];


}

Any thoughts to what might be causing the crash or how to remedy the crash?

Thank you!


回答1:


You're using a UIAlertController to display your share buttons without the inclusion of a UIPopoverPresentationController. You must use a UIPopoverPresentationController when your app is running on an iPad. Apple Docs on UIPopoverPresentationController.

For example:

-(IBAction)myButton:(id)sender {
    UIAlertController *shareController=   [UIAlertController
                                alertControllerWithTitle:nil
                                message:nil
                                preferredStyle:UIAlertControllerStyleActionSheet];
    UIAlertAction *shareServiceButton = [UIAlertAction
                                   actionWithTitle:@"Share Service"
                                   style:UIAlertActionStyleDefault
                                   handler:^(UIAlertAction *action)
                                   {
                                       // Share something
                                   }];
    [shareController addAction:shareServiceButton];

    // User on iPad
    UIPopoverPresentationController *popoverController;
    popoverController = shareController.popoverPresentationController;
    popoverController.sourceView = self.view;
    popoverController.sourceRect = self.myButton.frame;
    popoverController.permittedArrowDirections = UIPopoverArrowDirectionAny;

    [self presentViewController:shareController animated:YES completion:nil];
}


来源:https://stackoverflow.com/questions/29997369/ios-game-crashes-after-pressing-share-button-only-on-ipad

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!