ios ipad swift uiactionsheet

ios - ActionSheet no funciona iPad



swift uiactionsheet (6)

Debe proporcionar una vista o botón de fuente justo antes de presentar optionMenu ya que en iPad es un UIPopoverPresentationController, como dice su error. Esto solo significa que su hoja de acción apunta al botón que le permite al usuario saber desde dónde comenzó.

Por ejemplo, si presenta su menú de opciones tocando el elemento de la barra de navegación derecha. Podrías hacer algo como esto:

optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem self.presentViewController(optionMenu, animated: true, completion: nil)

o puede establecer una vista como esta: (Solo necesita uno de estos 2)

optionMenu.popoverPresentationController?.sourceView = yourView self.presentViewController(optionMenu, animated: true, completion: nil)

También tenga en cuenta que si cambia su UIAlertControllerStyle a Alert en lugar de la hoja de acción, no necesitará especificar esto. Estoy seguro de que debe haberlo descubierto, pero solo quería ayudar a cualquiera que se encuentre con esta página.

Estoy usando ActionSheet en mi aplicación. En mi iPhone funciona, pero no en el simulador de iPad.

Este es mi código:

@IBAction func dialog(sender: AnyObject) { let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet) let deleteAction = UIAlertAction(title: "Delete", style: .Default, handler: { (alert: UIAlertAction!) -> Void in println("Filtre Deleted") }) let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: { (alert: UIAlertAction!) -> Void in println("Cancelled") }) optionMenu.addAction(deleteAction) optionMenu.addAction(cancelAction) self.presentViewController(optionMenu, animated: true, completion: nil) }

Y mi error:

Finalización de la aplicación debido a la excepción no detectada ''NSGenericException'', razón: ''Su aplicación ha presentado 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 popoverPresentationController del controlador de alertas. Debe proporcionar sourceView y sourceRect o barButtonItem. Si no conoce esta información cuando presente el controlador de alertas, puede proporcionarla en el método UIPopoverPresentationControllerDelegate -prepareForPopoverPresentation ".


El mismo problema para mi. Tenía un UIAlertController que funcionaba bien en el teléfono, pero se bloqueó en el iPad. La hoja aparece cuando se toca una celda desde una vista de tabla.

Para Swift 3, agregué 3 líneas de código justo antes de presentarlo:

... sheet.popoverPresentationController?.sourceView = self.view sheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection() sheet.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) self.present(sheet, animated: true, completion: nil)


Si desea presentarlo en el centro sin flechas [ Swift 3+ ]:

if let popoverController = optionMenu.popoverPresentationController { popoverController.sourceView = self.view popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) popoverController.permittedArrowDirections = [] } self.present(optionMenu, animated: true, completion: nil)


Solo una nota de que también puede obtener este error si no ha vinculado la vista de origen en IB a la variable relevante en su aplicación.


Swift 3

Como se dijo anteriormente, debe configurar UIAlertController para que se presente en un punto específico en iPAD.

Ejemplo de barra de navegación:

// 1 let optionMenu = UIAlertController(title: nil, message: "Choose an option", preferredStyle: .actionSheet) // 2 let deleteAction = UIAlertAction(title: "Option 1", style: .default, handler: { (alert: UIAlertAction!) -> Void in print("option 1 pressed") }) let saveAction = UIAlertAction(title: "Option 2", style: .default, handler: { (alert: UIAlertAction!) -> Void in print("option 2 pressed") }) // let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: { (alert: UIAlertAction!) -> Void in print("Cancelled") }) // 4 optionMenu.addAction(deleteAction) optionMenu.addAction(saveAction) optionMenu.addAction(cancelAction) // 5 optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem self.present(optionMenu, animated: true) { print("option menu presented") }


agregue declaraciones en los siguientes términos antes de presentarlas.

optionMenu.popoverPresentationController.sourceView = self.view; optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0); @IBAction func dialog(sender: AnyObject) { ... optionMenu.popoverPresentationController.sourceView = self.view; optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0); self.presentViewController(optionMenu, animated: true, completion: nil) }

Funcionará bien.