2015-02-16 10 views
7

Quando un UIActivityViewController viene chiamato su iPhone in questa app, funziona perfettamente, ma quando viene chiamato su un iPad, l'app si arresta in modo anomalo. Di seguito è riportato il codice che ho usato:App iOS IOS 8 si blocca quando viene chiamato UIActivityViewController

func shareButtonPress() { 

    //when the share button is pressed, default share phrase is added, cropped image of highscore is added 

    var sharingItems = [AnyObject]() 

    var shareButtonHighscore = NSUserDefaults.standardUserDefaults().objectForKey("highscore") as Int! 

    sharingItems.append("Just hit \(shareButtonHighscore)! Beat it! #Swath") 

    UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0); 
    self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true) 
    var image:UIImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    sharingItems.append(image) 

    let activityViewController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil) 

    var barButtonItem: UIBarButtonItem! = UIBarButtonItem() 

    activityViewController.excludedActivityTypes = [UIActivityTypeCopyToPasteboard,UIActivityTypeAirDrop,UIActivityTypeAddToReadingList,UIActivityTypeAssignToContact,UIActivityTypePostToTencentWeibo,UIActivityTypePostToVimeo,UIActivityTypePrint,UIActivityTypeSaveToCameraRoll,UIActivityTypePostToWeibo] 

    self.presentViewController(activityViewController, animated: true, completion: nil) 

} 

Come potete vedere, io sono la programmazione a Swift, nel quadro SpriteKit, e non capisco il motivo per cui l'applicazione si blocca.

che sto ricevendo questo errore:

Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.' 

Cosa posso fare per risolvere questo problema?

+0

> Cosa posso fare per risolvere questo problema? - 1. leggere il messaggio di errore. 2. controlla i documenti su 'UIPopoverController' – Mundi

risposta

26

Prima di presentare la UIActivityViewController, aggiungere questa riga di codice:

activityViewController.popoverPresentationController?.sourceView = self.view 

in questo modo, il controllore vista sa in quale fotogramma del GameViewController appaia nel

+0

risposta correlata con maggiori dettagli. http://stackoverflow.com/a/34595918 – Suragch

3

Se andate a leggere l'errore che dice come risolvere il problema, è necessario impostare la barButtonItem o sourceView da cui partire per presentare la popover dal, nel tuo caso:

func shareButtonPress(pressedButton: UIBarButtonItem) { 

    ... 

    activityViewController.popoverPresentationController.barButtonItem = pressedButton 

    self.presentViewController(activityViewController, animated: true, completion: nil) 
} 
+0

Ora sto ricevendo questo errore:' [MyGame.GameViewController shareButtonPress]: selettore non riconosciuto inviato all'istanza 0x15f8c610'' – tdh

+0

Cosa posso fare per correggere questo? Non riesco a sostituire UIBarButtonItem con il nome del pulsante effettivo, perché il pulsante effettivo è definito in GameScene. – tdh

+0

Come si aggiunge la destinazione a UIBarButtonItem? – Steve

1

ci sono t. wo opzione, l'azione proveniva da un UIBarButtonitem o UIButton che è un UIView.

func shareButtonPress() { 

    ... 

    if let actv = activityViewController.popoverPresentationController { 
     actv.barButtonItem = someBarButton // if it is a UIBarButtonItem 

     // Or if it is a view you can get the view rect 
     actv.sourceView = someView 
     // actv.sourceRect = someView.frame // you can also specify the CGRect 
    } 

    self.presentViewController(activityViewController, animated: true, completion: nil) 
} 

Potrebbe essere necessario aggiungere un mittente la funzione come func shareButtonPress(sender: UIBarButtonItem) o func shareButtonPress(sender: UIButton)

1

ho aggiunto per Swift 3:

activityViewController.popoverPresentationController?.sourceView = self.view 

fisso il mio problema.