如何在 Swift 中呈现 iOSUIActionsheet?

如何在 iOS 应用程序中以 Swift 格式显示 UIActionsheet?

Here is my code for displaying a UIActionSheet:

@IBAction func downloadSheet(sender: AnyObject) {
let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .actionSheet)


let saveAction = UIAlertAction(title: "Save", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
println("Saved")
})
    

let deleteAction = UIAlertAction(title: "Delete", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
println("Deleted")
})
    

let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
(alert: UIAlertAction!) -> Void in
println("Cancelled")
})
optionMenu.addAction(deleteAction)
optionMenu.addAction(saveAction)
optionMenu.addAction(cancelAction)
self.presentViewController(optionMenu, animated: true, completion: nil)
}
143531 次浏览

Your Approach is fine, but you can add UIActionSheet with other way with ease.

您可以在 UIViewController 的

class ViewController: UIViewController ,UIActionSheetDelegate

设置你的方法就像,

@IBAction func downloadSheet(sender: AnyObject)
{


let actionSheet = UIActionSheet(title: "Choose Option", delegate: self, cancelButtonTitle: "Cancel", destructiveButtonTitle: nil, otherButtonTitles: "Save", "Delete")


actionSheet.showInView(self.view)
}

你可以得到你的按钮索引,当它点击喜欢

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int)
{
println("\(buttonIndex)")
switch (buttonIndex){


case 0:
println("Cancel")
case 1:
println("Save")
case 2:
println("Delete")
default:
println("Default")
//Some code here..


}
}

更新1: iOS8 +

    //Create the AlertController and add Its action like button in Actionsheet
let actionSheetControllerIOS8: UIAlertController = UIAlertController(title: "Please select", message: "Option to select", preferredStyle: .ActionSheet)


let cancelActionButton = UIAlertAction(title: "Cancel", style: .cancel) { _ in
print("Cancel")
}
actionSheetControllerIOS8.addAction(cancelActionButton)


let saveActionButton = UIAlertAction(title: "Save", style: .default)
{ _ in
print("Save")
}
actionSheetControllerIOS8.addAction(saveActionButton)


let deleteActionButton = UIAlertAction(title: "Delete", style: .default)
{ _ in
print("Delete")
}
actionSheetControllerIOS8.addAction(deleteActionButton)
self.present(actionSheetControllerIOS8, animated: true, completion: nil)

在 iOS8中,UIActionSheet已被弃用。

I am using following:

// Create the AlertController
let actionSheetController = UIAlertController(title: "Please select", message: "How you would like to utilize the app?", preferredStyle: .ActionSheet)


// Create and add the Cancel action
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
// Just dismiss the action sheet
}
actionSheetController.addAction(cancelAction)


// Create and add first option action
let takePictureAction = UIAlertAction(title: "Consumer", style: .Default) { action -> Void in
self.performSegueWithIdentifier("segue_setup_customer", sender: self)
}
actionSheetController.addAction(takePictureAction)


// Create and add a second option action
let choosePictureAction = UIAlertAction(title: "Service provider", style: .Default) { action -> Void in
self.performSegueWithIdentifier("segue_setup_provider", sender: self)
}
actionSheetController.addAction(choosePictureAction)


// We need to provide a popover sourceView when using it on iPad
actionSheetController.popoverPresentationController?.sourceView = sender as UIView


// Present the AlertController
self.presentViewController(actionSheetController, animated: true, completion: nil)

斯威夫特:

下面给出的示例代码同时适用于 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)

The Old Way: UIActionSheet

let actionSheet = UIActionSheet(title: "Takes the appearance of the bottom bar if specified; otherwise, same as UIActionSheetStyleDefault.", delegate: self, cancelButtonTitle: "Cancel", destructiveButtonTitle: "Destroy", otherButtonTitles: "OK")
actionSheet.actionSheetStyle = .Default
actionSheet.showInView(self.view)


// MARK: UIActionSheetDelegate


func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex  buttonIndex: Int) {
switch buttonIndex {
...
}
}

新方法: UIAlertController

let alertController = UIAlertController(title: nil, message: "Takes the appearance of the bottom bar if specified; otherwise, same as UIActionSheetStyleDefault.", preferredStyle: .ActionSheet)


let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel) { (action) in
// ...
}
alertController.addAction(cancelAction)


let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
// ...
}
alertController.addAction(OKAction)


let destroyAction = UIAlertAction(title: "Destroy", style: .Destructive) { (action) in
println(action)
}
alertController.addAction(destroyAction)


self.presentViewController(alertController, animated: true) {
// ...
}

在 Swift 中,可以使用以下代码打开 actionSheet:

let alert = UIAlertController(title: enter your title, message: "Enter your messgage. ", preferredStyle: UIAlertControllerStyle.Alert)


alert.addTextFieldWithConfigurationHandler(configurationTextField)


alert.addAction(UIAlertAction(title: "Close", style: UIAlertActionStyle.Cancel, handler:{ (UIAlertAction)in
print("User click Cancel button")
}))


alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler:{ (UIAlertAction)in
print("User click Ok button")
}))


self.presentViewController(alert, animated: true, completion: {
print("completion block")
})

更新为 Swift 4/5

适用于 iOS 11-14

其他一些答案还可以,但我最终将其中的一些混合搭配起来,得出了以下结论:

@IBAction func showAlert(sender: AnyObject) {
let alert = UIAlertController(title: "Title", message: "Please Select an Option", preferredStyle: .actionSheet)
    

alert.addAction(UIAlertAction(title: "Approve", style: .default , handler:{ (UIAlertAction)in
print("User click Approve button")
}))
    

alert.addAction(UIAlertAction(title: "Edit", style: .default , handler:{ (UIAlertAction)in
print("User click Edit button")
}))


alert.addAction(UIAlertAction(title: "Delete", style: .destructive , handler:{ (UIAlertAction)in
print("User click Delete button")
}))
    

alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler:{ (UIAlertAction)in
print("User click Dismiss button")
}))


    

//uncomment for iPad Support
//alert.popoverPresentationController?.sourceView = self.view


self.present(alert, animated: true, completion: {
print("completion block")
})
}

好好享受 :)

Update for Swift 3:

// Create the AlertController and add its actions like button in ActionSheet
let actionSheetController = UIAlertController(title: "Please select", message: "Option to select", preferredStyle: .actionSheet)


let cancelActionButton = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in
print("Cancel")
}
actionSheetController.addAction(cancelActionButton)


let saveActionButton = UIAlertAction(title: "Save", style: .default) { action -> Void in
print("Save")
}
actionSheetController.addAction(saveActionButton)


let deleteActionButton = UIAlertAction(title: "Delete", style: .default) { action -> Void in
print("Delete")
}
actionSheetController.addAction(deleteActionButton)
self.present(actionSheetController, animated: true, completion: nil)

使用 Swift3.0的 iOS10操作系统中的操作表。

 @IBAction func ShowActionSheet(_ sender: UIButton) {
// Create An UIAlertController with Action Sheet


let optionMenuController = UIAlertController(title: nil, message: "Choose Option from Action Sheet", preferredStyle: .actionSheet)


// Create UIAlertAction for UIAlertController


let addAction = UIAlertAction(title: "Add", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
print("File has been Add")
})
let saveAction = UIAlertAction(title: "Edit", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
print("File has been Edit")
})


let deleteAction = UIAlertAction(title: "Delete", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
print("File has been Delete")
})
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
(alert: UIAlertAction!) -> Void in
print("Cancel")
})


// Add UIAlertAction in UIAlertController


optionMenuController.addAction(addAction)
optionMenuController.addAction(saveAction)
optionMenuController.addAction(deleteAction)
optionMenuController.addAction(cancelAction)


// Present UIAlertController with Action Sheet


self.present(optionMenuController, animated: true, completion: nil)


}

Swift 3 在 iPad 上显示 UIBarButtonItem 的 UIAlertController

        let alert = UIAlertController(title: "Title", message: "Please Select an Option", preferredStyle: .actionSheet)


alert.addAction(UIAlertAction(title: "Approve", style: .default , handler:{ (UIAlertAction)in
print("User click Approve button")
}))


alert.addAction(UIAlertAction(title: "Edit", style: .default , handler:{ (UIAlertAction)in
print("User click Edit button")
}))


alert.addAction(UIAlertAction(title: "Delete", style: .destructive , handler:{ (UIAlertAction)in
print("User click Delete button")
}))


alert.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.cancel, handler:{ (UIAlertAction)in
print("User click Dismiss button")
}))


if let presenter = alert.popoverPresentationController {
presenter.barButtonItem = sender
}


self.present(alert, animated: true, completion: {
print("completion block")
})

更新为 Swift 3. x,Swift 4. x,Swift 5. x

// create an actionSheet
let actionSheetController: UIAlertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)


// create an action
let firstAction: UIAlertAction = UIAlertAction(title: "First Action", style: .default) { action -> Void in


print("First Action pressed")
}


let secondAction: UIAlertAction = UIAlertAction(title: "Second Action", style: .default) { action -> Void in


print("Second Action pressed")
}


let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in }


// add actions
actionSheetController.addAction(firstAction)
actionSheetController.addAction(secondAction)
actionSheetController.addAction(cancelAction)




// present an actionSheet...
// present(actionSheetController, animated: true, completion: nil)   // doesn't work for iPad


actionSheetController.popoverPresentationController?.sourceView = yourSourceViewName // works for both iPhone & iPad


present(actionSheetController, animated: true) {
print("option menu presented")
}

enter image description here

Swift 4(test)

let alertController = UIAlertController(title: "Select Photo", message: "Select atleast one photo", preferredStyle: .actionSheet)
let action1 = UIAlertAction(title: "From Photo", style: .default) { (action) in
print("Default is pressed.....")
}
let action2 = UIAlertAction(title: "Cancel", style: .cancel) { (action) in
print("Cancel is pressed......")
}
let action3 = UIAlertAction(title: "Click new", style: .default) { (action) in
print("Destructive is pressed....")


}
alertController.addAction(action1)
alertController.addAction(action2)
alertController.addAction(action3)
self.present(alertController, animated: true, completion: nil)


}

为 Swift 4,4.2,5工作的遗传行动表

如果你喜欢一个通用的版本,你可以从每个 ViewController和每个项目调用这个版本:

class Alerts {
static func showActionsheet(viewController: UIViewController, title: String, message: String, actions: [(String, UIAlertActionStyle)], completion: @escaping (_ index: Int) -> Void) {
let alertViewController = UIAlertController(title: title, message: message, preferredStyle: .actionSheet)
for (index, (title, style)) in actions.enumerated() {
let alertAction = UIAlertAction(title: title, style: style) { (_) in
completion(index)
}
alertViewController.addAction(alertAction)
}
// iPad Support
alertViewController.popoverPresentationController?.sourceView = viewController.view
     

viewController.present(alertViewController, animated: true, completion: nil)
}
}

Call like this in your ViewController.

    var actions: [(String, UIAlertActionStyle)] = []
actions.append(("Action 1", UIAlertActionStyle.default))
actions.append(("Action 2", UIAlertActionStyle.destructive))
actions.append(("Action 3", UIAlertActionStyle.cancel))
    

//self = ViewController
Alerts.showActionsheet(viewController: self, title: "D_My ActionTitle", message: "General Message in Action Sheet", actions: actions) { (index) in
print("call action \(index)")
/*
results
call action 0
call action 1
call action 2
*/
}

enter image description here

注意: 也许你想知道为什么我加入 Action 1/2/3但是得到的结果是0,1,2。在 for (index, (title, style)) in actions.enumerated()行中,我得到了操作的索引。数组总是以索引0开始。所以完成度是0,1,2。

如果希望设置枚举、 id 或其他标识符,我建议移交参数 actions中的对象。

SWIFT 4

可以在 iPhone 和 iPad 上使用,也可以旋转

LANDSCAPE 风景

PORTRAIT

肖像

代码(已测试)

let alert = UIAlertController()


let width: Int = Int(UIScreen.main.bounds.width - 100)


let viewAction    =     UIAlertAction(title: "View", style: .default , handler:{ (UIAlertAction)in
let storyboard      =   UIStoryboard(name: "Main", bundle: nil)
let orderDetailVC   =   storyboard.instantiateViewController(withIdentifier: "orderDetail") as! OrderDetailTableViewController


orderDetailVC.orderId     =   self.myDraftOrders[indexPath.row]["id"].intValue


self.navigationController?.pushViewController(orderDetailVC, animated: true)
})


viewAction.setValue(appGreenColor, forKey: "titleTextColor")


alert.addAction(viewAction)


let modifyAction    =   UIAlertAction(title: "Modify", style: .default, handler:{ (UIAlertAction)in
showAlert("Coming soon...")
})


modifyAction.setValue(appCyanColor, forKey: "titleTextColor")


alert.addAction(modifyAction)


let copyAction      =   UIAlertAction(title: "Copy", style: .default, handler:{ (UIAlertAction)in


self.copyOrder(orderId: self.myDraftOrders[indexPath.row]["id"].intValue)


})


copyAction.setValue(appBlueColor, forKey: "titleTextColor")


alert.addAction(copyAction)


alert.addAction(UIAlertAction(title: "Delete", style: .destructive , handler:{ (UIAlertAction)in


self.deleteOrder(orderId: self.myDraftOrders[indexPath.row]["id"].intValue, indexPath: indexPath)


}))


alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler:{ (UIAlertAction)in
print("User click Dismiss button")


}))


let popover = alert.popoverPresentationController


popover?.delegate = self


let cellT = tableView.cellForRow(at: indexPath)


popover?.sourceView =   cellT
popover?.sourceRect =   CGRect(x: width, y: 25, width: 100, height: 50)
present(alert, animated: true)

您可以在 Swift 4中使用下面的 Alert 和 ActionSheet 代码:

@IBAction func alert_act(_ sender: Any) {
do {
let alert = UIAlertController(title: "Alert", message: "Would you like to continue learning?", preferredStyle: UIAlertController.Style.alert)
        

alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: nil))
        

alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: nil))
        

self.present(alert, animated: true, completion: nil)
}
}


@IBAction func action_sheet1(_ sender: Any) {
let action_sheet1 = UIAlertController(title: nil, message: "Alert message.", preferredStyle: .actionSheet)
    

let defaultAction = UIAlertAction(title: "Default", style: .default, handler: nil)
let deleteAction = UIAlertAction(title: "Delete", style: .destructive, handler: nil)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    

action_sheet1.addAction(defaultAction)
action_sheet1.addAction(deleteAction)
action_sheet1.addAction(cancelAction)
    

self.present(action_sheet1, animated: true, completion: nil)
}

Code for adding alerts to actionsheet in swift4

   *That means when we click actionsheet values(like edit/ delete..so on) it shows
an alert option that is set with Yes or No option*




class ViewController: UIViewController
{


override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}


@IBAction func action_sheet1(_ sender: Any) {








let action_sheet1 = UIAlertController(title: "Hi Bro", message: "Please Select an Option: ", preferredStyle: .actionSheet)


action_sheet1.addAction(UIAlertAction(title: "Approve", style: .default , handler:{ (alert: UIAlertAction!) -> Void in
print("User click Approve button")






let alert = UIAlertController(title: "Approve", message: "Would you like to approve the file ", preferredStyle: UIAlertController.Style.alert)


alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: nil))


alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: nil))




self.present(alert, animated: true, completion: nil)


}))








action_sheet1.addAction(UIAlertAction(title: "Edit", style: .default , handler:{ (alert: UIAlertAction!) -> Void in
print("User click Edit button")


let alert = UIAlertController(title: "Edit", message: "Would you like to edit the file ", preferredStyle: UIAlertController.Style.alert)


alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: nil))


alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: nil))




self.present(alert, animated: true, completion: nil)


}))








action_sheet1.addAction(UIAlertAction(title: "Delete", style: .destructive , handler: { (alert: UIAlertAction!) -> Void in
print("User click Delete button")






let alert = UIAlertController(title: "Delete", message: "Would you like to delete the file permenently?", preferredStyle: UIAlertController.Style.alert)


alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: nil))


alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: nil))




self.present(alert, animated: true, completion: nil)


}))










action_sheet1.addAction(UIAlertAction(title: "cancel", style: .cancel, handler:{ (alert: UIAlertAction!) -> Void in
print("User click cancel button")




let alert = UIAlertController(title: "Cancel", message: "Would you like to cancel?", preferredStyle: UIAlertController.Style.alert)


alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: nil))


alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.default, handler: nil))




self.present(alert, animated: true, completion: nil)


}))






self.present(action_sheet1, animated: true, completion: {
print("completion block")
})
}




}

用于填充动态操作列表,并监听所选操作:

var categories = ["Science", "History", "Industry", "Agriculture"]


var handlerSelectedCategory: ((Int) -> ())?


func prepareActions(for title: String, index: Int) -> UIAlertAction {


let alertAction = UIAlertAction(title: title, style: .default) { (action) in
self.handlerSelectedCategory?(index)
}


return alertAction
}


@objc func presentActions() {


let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
// add dymamic options
for (index, element) in self.categories.enumerated() {
optionMenu.addAction(prepareActions(for: element, index: index))
}
// cancel
let cancelAction = UIAlertAction(title: "Cancel", style: .destructive)
optionMenu.addAction(cancelAction)


handlerSelectedCategory = { index in
print(index, self.categories[index])
}


self.present(optionMenu, animated: true, completion: nil)
}

Swift 5 + 非常简单和平滑的方式只需要调用这个函数,轰! ! ! ! ! ! !

let IPAD = UIDevice.current.userInterfaceIdiom == .pad




//Mark:- Choose Image Method
func funcMyActionSheet() {
var myActionSheet = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertController.Style.actionSheet)
myActionSheet.view.tintColor = UIColor.black
let galleryAction = UIAlertAction(title: "Gallery".localizableString(language: Defaults.selectedLanguageCode), style: .default, handler: {
(alert: UIAlertAction!) -> Void in
self.openGallary()
})
let cmaeraAction = UIAlertAction(title: "Camera".localizableString(language: Defaults.selectedLanguageCode), style: .default, handler: {
(alert: UIAlertAction!) -> Void in
self.openCamera()
})
let cancelAction = UIAlertAction(title: "Cancel".localizableString(language: Defaults.selectedLanguageCode), style: .cancel, handler: {
(alert: UIAlertAction!) -> Void in
})
    



if IPAD {
//In iPad Change Rect to position Popover
myActionSheet = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertController.Style.alert)
}
myActionSheet.addAction(galleryAction)
myActionSheet.addAction(cmaeraAction)
myActionSheet.addAction(cancelAction)
print("Action Sheet call")
    

self.present(myActionSheet, animated: true, completion: nil)
}

2022 Swift 5

func yourActionSheet() -> UIAlertController {
let alert = UIAlertController(title: "Your title",
message: nil,
preferredStyle: .actionSheet)


alert.addAction(UIAlertAction(title: "Your action 1",
style: .default) { _ in
// onAction1()
})


alert.addAction(UIAlertAction(title: "Your action 2",
style: .default) { _ in
// onAction2()
})


alert.addAction(UIAlertAction(title: "Your cancel action",
style: .cancel) { _ in
// onCancel
})


return alert
}