iphone ipad swift uiactionsheet
https://www.dropbox.com/s/54jqd8nsc67ll5g/test.zip?dl=0

iphone - Swift UIAlertController-> ActionSheet iPad iOS8 Bloqueos



uiactionsheet (4)

Actualmente me estoy metiendo en un gran problema con mi ActionSheet. En iPhone funciona muy bien, pero en iPad solo se bloquea

Creo un nuevo proyecto con solo un botón

import UIKit extension ViewController : UIActionSheetDelegate { func actionSheet(actionSheet: UIActionSheet, didDismissWithButtonIndex buttonIndex: Int) { if actionSheet.tag == 0 { if buttonIndex == 1 { // doing something for "product page" } else if (buttonIndex == 2) { // doing something for "video" } } } } class ViewController: UIViewController, UIActionSheetDelegate { @IBAction func test(sender: AnyObject) { let systemVersion: NSInteger = (UIDevice.currentDevice().systemVersion as NSString).integerValue if systemVersion < 8 { // iOS7: let action:UIActionSheet = UIActionSheet(title: "Change Map Type", delegate: self, cancelButtonTitle: "Back", destructiveButtonTitle: nil, otherButtonTitles: "Product Page", "Video") action.tag = 0 action.showInView(self.view) } else { // iOS8: let alertController: UIAlertController = UIAlertController(title: "Change Map Type", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) let cancelAction: UIAlertAction = UIAlertAction(title: "Back", style: UIAlertActionStyle.Cancel, handler: nil) let button1action: UIAlertAction = UIAlertAction(title: "Product Page", style: UIAlertActionStyle.Default, handler: { (action: UIAlertAction!) -> () in // doing something for "product page" }) let button2action: UIAlertAction = UIAlertAction(title: "Video", style: UIAlertActionStyle.Default, handler: { (action: UIAlertAction!) -> () in // doing something for "video" }) alertController.addAction(cancelAction) alertController.addAction(button1action) alertController.addAction(button2action) self.presentViewController(alertController, animated: true, completion: nil) } } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } }

Como dije en el iPhone, funciona, pero si hago clic en el botón del iPad, la aplicación se bloquea con

2014-09-25 14: 54: 52.784 test [9541: 1970048] * Aplicación de finalización debido a la excepción no detectada ''NSGenericException'', razón: ''Su aplicación presentó un UIAlertController () de estilo UIAlertControllerStyleActionSheet. El modalPresentationStyle de un UIAlertController con este estilo es UIModalPresentationPopover. Debe proporcionar información de ubicación para este popover a través del controlador de alerta popoverPresentationController. Debe proporcionar un sourceView y sourceRect o un barButtonItem. Si no se conoce esta información cuando presenta el controlador de alertas, puede proporcionarlo en el método UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation. '' * Primera pila de llamadas throw: (0 CoreFoundation 0x00613df6 exceptionPreprocess + 182 1 libobjc.A.dylib
0x01fdaa97 objc_exception_throw + 44 2 UIKit
0x0164da37 - [UIPopoverPresentationController presentationTransitionWillBegin] + 3086 3 UIKit
0x00f54f75 __71- [UIPresentationController _initViewHierarchyForPresentationSuperview:] _ block_invoke + 1666 4 UIKit 0x00f53554 __56- [UIPresentationController runTransitionForCurrentState] _block_invoke + 226 5 UIKit
0x00f8721b __40 + [UIViewController _scheduleTransition:] _ block_invoke + 18 6 UIKit 0x00e4d62e ___afterCACommitHandler_block_invoke + 15 7 UIKit 0x00e4d5d9 _applyBlockToCFArrayCopiedToStack + 415 8 UIKit
0x00e4d3ee _afterCACommitHandler + 545 9 CoreFoundation
0x00536fbe __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 30 10 CoreFoundation 0x00536f00 __CFRunLoopDoObservers + 400 11 CoreFoundation 0x0052c93a __CFRunLoopRun + 1226 12 CoreFoundation 0x0052c1ab CFRunLoopRunSpecific + 443 13 CoreFoundation
0x0052bfdb CFRunLoopRunInMode + 123 14 GraphicsServices
0x0438424f GSEventRunModal + 192 15 GraphicsServices
0x0438408c GSEventRun + 104 16 UIKit
0x00e23e16 UIApplicationMain + 1526 17 prueba
0x00085e9e top_level_code + 78 18 test
0x00085edb main + 43 19 libdyld.dylib
0x0273eac9 start + 1 20 ???
0x00000001 0x0 + 1) libc ++ abi.dylib: terminando con una excepción no detectada de tipo NSException

El proyecto se puede encontrar en https://www.dropbox.com/s/54jqd8nsc67ll5g/test.zip?dl=0 para descargar e intentar.


El mensaje de error le dice que debe dar al controlador popoverPresentationController una ubicación para que pueda posicionarse correctamente. Esto es fácil de hacer: solo verifique si hay un controlador de popover y agregue el remitente como fuente.

Si su botón es un UIBarButtonItem :

if let popoverController = alertController.popoverPresentationController { popoverController.barButtonItem = sender } self.presentViewController(alertController, animated: true, completion: nil)

De otra manera:

if let popoverController = alertController.popoverPresentationController { popoverController.sourceView = sender popoverController.sourceRect = sender.bounds } self.presentViewController(alertController, animated: true, completion: nil)


Nate Cook tiene toda la razón, sin embargo, lo haría, así que puedo detectar si es iPad o iPhone.

Esto es para barButtonItem :

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad ){ if let currentPopoverpresentioncontroller = alertController.popoverPresentationController{ currentPopoverpresentioncontroller.barButtonItem = sender as! UIBarButtonItem currentPopoverpresentioncontroller.permittedArrowDirections = UIPopoverArrowDirection.down; self.present(alertController, animated: true, completion: nil) } }else{ self.present(alertController, animated: true, completion: nil) }


prueba esto

alertController.popoverPresentationController?.sourceView = self.view


var actionSheet = UIAlertController (título: "Seleccione la cámara o la biblioteca de fotos", mensaje: "", preferredStyle: .actionSheet)

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad ){ actionSheet = UIAlertController(title: "Please Select Camera or Photo Library", message: "", preferredStyle: .alert) } actionSheet.addAction(UIAlertAction(title: "Upload a Photo", style: .default, handler: { (UIAlertAction) in self.openPhotoLibrary() })) actionSheet.addAction(UIAlertAction(title: "Take a Photo", style: .default, handler: { (UIAlertAction) in self.openCamera() })) actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) self.present(actionSheet, animated: true, completion: nil)