How can I create an UIAlertController with a cancel button and three other buttons with an icon? I am supporting iOS 8 upwards.
Each entry should be tinted...
I tried and searched a lot and finally found the answer. Here it is:
**Create the `UIAlertController` with icons:**
The important part is the addition of the icons with action1.setValue(UIImage(named: "Icon1"), forKey: "image")
let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
let action1 = UIAlertAction(title: "Test 1", style: .Default, handler: {
[unowned self] (alert: UIAlertAction!) -> Void in
print("Action 1")
})
action1.setValue(UIImage(named: "Icon1"), forKey: "image")
let action2 = UIAlertAction(title: "Test 2", style: .Default, handler: {
[unowned self] (alert: UIAlertAction!) -> Void in
print("Action 2")
})
action2.setValue(UIImage(named: "Icon2"), forKey: "image")
let action3 = UIAlertAction(title: "Test 3", style: .Default, handler: {
[unowned self] (alert: UIAlertAction!) -> Void in
print("Action 3")
})
action3.setValue(UIImage(named: "Icon3"), forKey: "image")
let cancelAction = UIAlertAction(title: "Close", style: .Cancel, handler: nil)
optionMenu.addAction(action1)
optionMenu.addAction(action2)
optionMenu.addAction(action3)
optionMenu.addAction(cancelAction)
presentViewController(optionMenu, animated: true, completion: nil)
This is what I got. Ok so far 😀
**Tinting the entries**
Then I tried to tint everything and I added the following line underneath the instantiation of UIAlertController:
optionMenu.view.tintColor = Colors.getColors().primaryTintColor
This looked pretty good with iOS8, but as I tested the same code with iOS9 I was surprised (the localization difference is because of different settings in the simulators):
iOS8
iOS9
**The solution**
I took me quite a while but then I found the solution.
You have to set the tint color after you present the UIAlertController. 😎
This is the final code:
let optionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
let action1 = UIAlertAction(title: "Test 1", style: .Default, handler: {
[unowned self] (alert: UIAlertAction!) -> Void in
print("Action 1")
})
action1.setValue(UIImage(named: "Icon1"), forKey: "image")
let action2 = UIAlertAction(title: "Test 2", style: .Default, handler: {
[unowned self] (alert: UIAlertAction!) -> Void in
print("Action 2")
})
action2.setValue(UIImage(named: "Icon2"), forKey: "image")
let action3 = UIAlertAction(title: "Test 3", style: .Default, handler: {
[unowned self] (alert: UIAlertAction!) -> Void in
print("Action 3")
})
action3.setValue(UIImage(named: "Icon3"), forKey: "image")
let cancelAction = UIAlertAction(title: "Close", style: .Cancel, handler: nil)
optionMenu.addAction(action1)
optionMenu.addAction(action2)
optionMenu.addAction(action3)
optionMenu.addAction(cancelAction)
presentViewController(optionMenu, animated: true, completion: nil)
optionMenu.view.tintColor = Colors.getColors().primaryTintColor
Related
I wanna add message to phone call alert popup.
how to make it?
enter image description here
Yes, you can do it like that:
func phoneCall(to phoneNumber:String) {
if let callURL:URL = URL(string: "tel:\(phoneNumber)") {
let application:UIApplication = UIApplication.shared
if (application.canOpenURL(callURL)) {
let alert = UIAlertController(title: "Your Title", message: "Do you want call that number?", preferredStyle: .alert)
let callAction = UIAlertAction(title: "Call", style: .default, handler: { (action) in
application.openURL(callURL)
})
let noAction = UIAlertAction(title: "No", style: .cancel, handler: { (action) in
print("Canceled Call")
})
alert.addAction(callAction)
alert.addAction(noAction)
self.present(alert, animated: true, completion: nil)
}
}
}
So I have this code that will get photos my gallery or use the camera to change the UIImage.
#IBAction func tappedCamera() {
print("tapped camera")
let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .actionSheet)
let cameraAction = UIAlertAction(title: "Camera", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
self.picker.sourceType = UIImagePickerControllerSourceType.camera;
self.picker.allowsEditing = true
self.present(self.picker, animated: true, completion: nil)
}
})
let galleryAction = UIAlertAction(title: "Gallery", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
self.picker.sourceType = UIImagePickerControllerSourceType.photoLibrary;
self.picker.allowsEditing = true
self.present(self.picker, animated: true, completion: nil)
}
})
let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: {
(alert: UIAlertAction!) -> Void in
//do none
})
optionMenu.addAction(cameraAction)
optionMenu.addAction(galleryAction)
optionMenu.addAction(cancelAction)
self.present(optionMenu, animated: true, completion: nil)
}
But I always get this error, whenever I try to capture a photo or select an image from the gallery.
[Generic] Creating an image format with an unknown type is an error
I solved it by fixing my user defaults. Because somewhere along the code I was messing up with the images, converting them to base64 strings, then saving it to user defaults.
I am new in swift. I made simple iphone app. Use this link: http://www.oodlestechnologies.com/blogs/Open-Image-Gallery-and-Take-photo-in-Swift and my app worked perfect. I want my app to select cropable image like facebook or telegram.
Like this:
My code:
private func showBottomActionSheet(){
let chooseOptionMenu = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
let takePhotoAction = UIAlertAction(title: "Take Photo", style: .Default, handler: {
(alert: UIAlertAction!) -> Void in
self.openCamera()
})
let choosePhotoAction = UIAlertAction(title: "Choose Photo", style: .Default, handler: {
(alert: UIAlertAction!) -> Void in
self.openGallary()
})
let findImagesAction = UIAlertAction(title: "Find Images", style: .Default, handler: {
(alert: UIAlertAction!) -> Void in
print("Clicked Find Images")
})
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
(alert: UIAlertAction!) -> Void in
print("Cancelled")
})
chooseOptionMenu.addAction(takePhotoAction)
chooseOptionMenu.addAction(choosePhotoAction)
chooseOptionMenu.addAction(findImagesAction)
chooseOptionMenu.addAction(cancelAction)
self.presentViewController(chooseOptionMenu, animated: true, completion: nil)
}
private func openGallary()
{
self.picker!.allowsEditing = false
self.picker!.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
presentViewController(picker!, animated: true, completion: nil)
}
private func openCamera()
{
if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)){
self.picker!.allowsEditing = false
self.picker!.sourceType = UIImagePickerControllerSourceType.Camera
self.picker!.cameraCaptureMode = .Photo
presentViewController(self.picker!, animated: true, completion: nil)
}else{
let alert = UIAlertController(title: "Camera Not Found", message: "This device has no Camera", preferredStyle: .Alert)
let ok = UIAlertAction(title: "OK", style:.Default, handler: nil)
alert.addAction(ok)
presentViewController(alert, animated: true, completion: nil)
}
}
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
dismissViewControllerAnimated(true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]){
let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
self.choosenPhoto = chosenImage
DefaultUser.setUserImage(chosenImage)
dismissViewControllerAnimated(true, completion: nil)
}
I found objective c code but didn't find code for swift 2.
Plz, advise me. thanks !
I am going to use UIAlertController for a user to select one item.
The items to select are array as following:
let arraySelect = ["NewYork", "Washington", "Seoul", "Tokyo", "Peking", "Sidney", ... ]
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .Alert)
// Add items in array to Alert
for var i = 0; i < arraySelect.count; i++ {
alert.addAction(UIAlertAction(title: arrayBibleVersions[i], style: .Default, handler: {(_) in }))
}
// Add cancel button.
alert.addAction(UIAlertAction(title: "취소", style: .Cancel, handler: {(_) in }))
self.presentViewController(alert, animated: false, completion: nil)
When a user touched one item, I have to get the index of the item that a user toched on.
But I don't know how to get the index..
Please help me.
I solved my question as following:
let arraySelect = ["NewYork", "Washington", "Seoul", "Tokyo", "Peking", "Sidney", ... ]
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .Alert)
let closure = { (action: UIAlertAction!) -> Void in
let index = alert.actions.indexOf(action)
if index != nil {
NSLog("Index: \(index!)")
}
}
for var i = 0; i < arrayBibleVersions.count; i++ {
alert.addAction(UIAlertAction(title: arrayBibleVersions[i][1], style: .Default, handler: closure))
}
alert.addAction(UIAlertAction(title: "cancel", style: .Cancel, handler: {(_) in }))
self.presentViewController(alert, animated: false, completion: nil)
This is how I solved it in Swift 4 / iOS11
projects.forEach { project in
alertController.addAction(
UIAlertAction(title: project.name, style: .default, handler: { action in
if let index = alertController.actions.index(where: { $0 === action }) {
self.showProject(project: projects[index])
}
})
)
}
I have the same problem too and found the method below which saved me.
But be careful if the item in array are the same, it will return the first item's index.
Fortunately, It's work in this case, because we create the action and using action to search.
extension Array where Self.Element : Equatable {
...
#inlinable public func index(of element: Element) -> Int?
...
}
It work in Swift 4
let arraySelect = ["NewYork", "Washington", "Seoul", "Tokyo", "Peking", "Sidney"]
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .alert)
// Add items in array to Alert
for name in arraySelect {
alert.addAction(UIAlertAction(title: name, style: .default, handler: {(action) in
// print idx that user selected
if let idx = alert.actions.index(of: action) {
print("idx = \(idx)")
}
}))
}
// Add cancel button.
alert.addAction(UIAlertAction(title: "취소", style: .cancel, handler: {(_) in }))
self.present(alert, animated: true, completion: nil)
This is working good:
var arraySelect = ["NewYork", "Washington", "Seoul", "Tokyo", "Peking", "Sidney"]
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .Alert)
let closure = { (action: UIAlertAction!) -> Void in
let index = alert.actions.indexOf(action)
if index != nil {
NSLog("Index: \(index!)")
}
}
for field in arraySelect {
alert.addAction(UIAlertAction(title: field, style: .Default, handler: closure))
}
alert.addAction(UIAlertAction(title: "cancel", style: .Cancel, handler: {(_) in }))
self.presentViewController(alert, animated: false, completion: nil)
Block is executed when the user selects a action.
// Add cancel button.
alert.addAction(UIAlertAction(title: "취소", style: .Cancel, handler: {(_) in
//your code
}))
func FirefoxAhri(){
let optionMenu = UIAlertController(title: "title", message: "message", preferredStyle: UIAlertControllerStyle.ActionSheet)
let action1 = UIAlertAction(title: "Yes", style: UIAlertActionStyle.Destructive){
action -> Void in
//do stuff on click Yes
}
let action2 = UIAlertAction(title: "No", style: UIAlertActionStyle.Destructive){
action -> Void in
//do stuff on click No
}
let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
print("Cancel")
// do nothing if you don't want. alert closes automatically
}
optionMenu.addAction(action1)
optionMenu.addAction(action2)
optionMenu.addAction(cancelAction)
self.presentViewController(optionMenu, animated: true, completion: nil)
}
In one of my viewController, I want to make an alert box appear that prompts the user to type this information.Then, I want the user to store this input using NSUserDefaults. How can I achieve this?
Thank you in advance!
Check this out:
let alertController = UIAlertController(title: "Email?", message: "Please input your email:", preferredStyle: .alert)
let confirmAction = UIAlertAction(title: "Confirm", style: .default) { (_) in
guard let textFields = alertController.textFields,
textFields.count > 0 else {
// Could not find textfield
return
}
let field = textFields[0]
// store your data
UserDefaults.standard.set(field.text, forKey: "userEmail")
UserDefaults.standard.synchronize()
}
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in }
alertController.addTextField { (textField) in
textField.placeholder = "Email"
}
alertController.addAction(confirmAction)
alertController.addAction(cancelAction)
self.present(alertController, animated: true, completion: nil)
SWIFT 3
func presentAlert() {
let alertController = UIAlertController(title: "Email?", message: "Please input your email:", preferredStyle: .alert)
let confirmAction = UIAlertAction(title: "Confirm", style: .default) { (_) in
if let emailTextField = alertController.textFields?[0] {
// do your stuff with emailTextField
}
}
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { (_) in }
alertController.addTextField { (textField) in
textField.placeholder = "Email"
}
alertController.addAction(confirmAction)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
}
In swift 3
let alertController = UIAlertController(title: "SecureStyle", message: "SecureStyle AlertView.", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addTextFieldWithConfigurationHandler { (textField : UITextField) -> Void in
textField.secureTextEntry = true
textField.placeholder = "Password"
}
let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { (result : UIAlertAction) -> Void in
print("Cancel")
}
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) { (result : UIAlertAction) -> Void in
print(alertController.textFields?.first?.text)
}
alertController.addAction(cancelAction)
alertController.addAction(okAction)
self.presentViewController(alertController, animated: true, completion: nil)