如何在iPad中显示Actionsheet

时间:2016-08-09 19:24:58

标签: ios swift ipad uialertcontroller

当我使用我当前的代码时,如何在iPad中显示UIActionsheet给我这个错误:

  

您的应用已提供UIAlertController<UIAlertController: 0x7f9ec624af70>)样式UIAlertControllerStyleActionSheet。具有此样式的modalPresentationStyle的{​​{1}}为UIAlertController。您必须通过警报控制器UIModalPresentationPopover为此弹出窗口提供位置信息。您必须提供popoverPresentationControllersourceViewsourceRect。如果在您提供警报控制器时未知此信息,您可以使用barButtonItem方法UIPopoverPresentationControllerDelegate提供此信息。

在iPhone上工作得很好:

-prepareForPopoverPresentation

我遇到了一些类似的问题,解决方法是:

let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
let reminderAction = UIAlertAction(title: "Reminder", style: .Default, handler: {
                (alert: UIAlertAction!) -> Void in }
optionMenu.addAction(reminderAction)
self.presentViewController(optionMenu, animated: true, completion: nil)

但它对我没有用,可能是因为我的ActionSheet的发件人在UItableviewCell上。

我厌倦了将AlertController的Sourceview设置为tableView的Cell,但它没有正确放置,有时它部分可见这是我试过的:

let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
optionMenu.popoverPresentationController?.sourceView = self.view
optionMenu.popoverPresentationController?.sourceRect = self.view.bounds

有任何线索如何解决这个问题?

6 个答案:

答案 0 :(得分:7)

下面给出的示例代码适用于iPhone和iPad。

 guard let viewRect = sender as? UIView else {
            return
        }

    let cameraSettingsAlert = UIAlertController(title: NSLocalizedString("Please choose a course", comment: ""), message: NSLocalizedString("", comment: ""), preferredStyle: .ActionSheet)
    cameraSettingsAlert.modalPresentationStyle = .Popover

    let photoResolutionAction = UIAlertAction(title: NSLocalizedString("Photo Resolution", comment: ""), style: .Default) { action in

    }
    let cameraOrientationAction = UIAlertAction(title: NSLocalizedString("Camera Orientation", comment: ""), style: .Default) { action in

    }
    let flashModeAction = UIAlertAction(title: NSLocalizedString("Flash Mode", comment: ""), style: .Default) { action in

    }
    let timeStampOnPhotoAction = UIAlertAction(title: NSLocalizedString("Time Stamp on Photo", comment: ""), style: .Default) { action in

    }
    let cancel = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel) { action in

    }
    cameraSettingsAlert.addAction(cancel)
    cameraSettingsAlert.addAction(cameraOrientationAction)
    cameraSettingsAlert.addAction(flashModeAction)
    cameraSettingsAlert.addAction(timeStampOnPhotoAction)
    cameraSettingsAlert.addAction(photoResolutionAction)

    if let presenter = cameraSettingsAlert.popoverPresentationController {
        presenter.sourceView = viewRect;
        presenter.sourceRect = viewRect.bounds;
    }
    presentViewController(cameraSettingsAlert, animated: true, completion: nil)

答案 1 :(得分:3)

如果你想在iPad上显示任何ActionSheet,那么他们使用popoverPresentationController来显示并且在iPad上不显示动作表的取消样式按钮。 在Swift 3中使用此代码:

  @IBAction func ActionSheetShow(_ sender: UIButton) {

  let actionSheet = UIAlertController(title: "Choose any option", message: "choose as you like here!", preferredStyle: .actionSheet)

    actionSheet.addAction(UIAlertAction(title: "Click1", style: .cancel, handler: {
    action in
        print("first button")
    }))
    actionSheet.addAction(UIAlertAction(title: "Click2", style: .default, handler: {
        action in
        print("second button")
    }))
    actionSheet.addAction(UIAlertAction(title: "Click3", style: .destructive, handler: {
        action in
        print("third button")
    }))
    actionSheet.popoverPresentationController?.sourceView = self.view
    actionSheet.popoverPresentationController?.sourceRect = sender.frame
    present(actionSheet, animated: true, completion: nil)
}

祝你好运!

答案 2 :(得分:3)

Swift 4.1解决方案:-

  
      
  1. MAK Eextension文件UIDEviceExtension.swift,并带有以下代码:-
  2.   
import Foundation
import UIKit
public extension UIDevice {

    public class var isPhone: Bool {
        return UIDevice.current.userInterfaceIdiom == .phone
    }

    public class var isPad: Bool {
        return UIDevice.current.userInterfaceIdiom == .pad
    }

    public class var isTV: Bool {
        return UIDevice.current.userInterfaceIdiom == .tv
    }

    public class var isCarPlay: Bool {
        return UIDevice.current.userInterfaceIdiom == .carPlay
    }

}
  
      
  1. 通过此单独的常用方法在UIViewcontroller上调用操作表:-
  2.   
import Foundation
import UIKit
class Common: NSObject{
       public class func showActionSheet(vc: UIViewController,sender:UIButton? = nil) {

                let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)

                actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: { (alert:UIAlertAction!) -> Void in
                    //self.camera()
                }))

                actionSheet.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { (alert:UIAlertAction!) -> Void in
                    //self.photoLibrary()
                }))

                actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

                //if iPhone
                if UIDevice.isPhone {
                    vc.present(actionSheet, animated: true, completion: nil)
                }
                else {
                    //In iPad Change Rect to position Popover
                    if let btn = sender{
                        actionSheet.popoverPresentationController?.sourceRect = btn.frame
                        actionSheet.popoverPresentationController?.sourceView = vc.view

                    }
                    vc.present(actionSheet, animated: true, completion: nil)
                }

            }
    }
  
      
  1. 在您的UIButton中使用它单击适用于iPhone / iPad的两者:-
  2.   
   @objc func btnPicImageTaped(btn:UIButton){
        print("it will work for both iPhone /ipad")
        Common.showActionSheet(vc: self,sender: btn)
}

答案 3 :(得分:0)

在presentViewController之前添加以下两行。 ( Swift 3.2

 optionMenu.popoverPresentationController?.sourceView = self.view
 optionMenu.popoverPresentationController?.sourceRect = (sender as AnyObject).frame
 present(optionMenu, animated: true, completion: nil)

答案 4 :(得分:0)

已更新为快速5

extension UIDevice {

    class var isPhone: Bool {
        return UIDevice.current.userInterfaceIdiom == .phone
    }

     class var isPad: Bool {
        return UIDevice.current.userInterfaceIdiom == .pad
    }

     class var isTV: Bool {
        return UIDevice.current.userInterfaceIdiom == .tv
    }

     class var isCarPlay: Bool {
        return UIDevice.current.userInterfaceIdiom == .carPlay
    }

}

答案 5 :(得分:0)

您可以从发件人处获取sourceView和sourceRect:

@IBAction func btMenuPressed(_ sender: Any) {
    let Sender = sender as? UIButton
    let actSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
    actSheet.addAction(UIAlertAction(title: "settings", style: .default) { _ in self.doSettings() })
    ...
    ...
    actSheet.popoverPresentationController?.sourceView = Sender!.superview!    
    actSheet.popoverPresentationController?.sourceRect = Sender!.frame
    resent(actSheet, animated: true)
}