I'm creating this alert view and trying to use the delegate method alertViewShouldEnableFirstOtherButton but it isn't being called.
Documentation says it is going to be deprecated in iOS9 but I'm using iOS8
var alert = UIAlertView(title: "Edit collection name", message: "", delegate: self, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")
alert.alertViewStyle = UIAlertViewStyle.PlainTextInput
alert.show()
*update as Duncan pointed out UIAlertView is deprecated in iOS8.
UIAlertView is deprecated in iOS8. Credit to #Duncan C
Related
This is the code I am writing to display UIActionSheet.
actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(#"updateresponseforrecurring", nil) delegate:self cancelButtonTitle:NSLocalizedString(#"Cancel", nil) destructiveButtonTitle:nil otherButtonTitles:
NSLocalizedString(#"updateresponseonlyforthis", nil),
NSLocalizedString(#"updateresponseforallactivities", nil),
nil];
actionSheet.tag = 2;
[actionSheet showInView:[UIApplication sharedApplication].keyWindow];
This is what I get using this :
Clearly, second option is longer and thus the size gets smaller to accommodate the width.
But I want the same font size for all the options which leaves me with multiline. Also tried with UIAlertController but not able to set multiline text.
How to achieve this ?
This seems to work in iOS 10 and Swift 3.1:
UILabel.appearance(whenContainedInInstancesOf: [UIAlertController.self]).numberOfLines = 2
This is not possible with the standard UIAlertController or UIAlertView.
I would recommend you to make it shorter. Why don't you make an alert and type something like this:
Do you want to update the response only for this instance or for all
activities in this series.
The answers would be these:
Only this instance
All activities
In iOS 10:
If you want to apply it to all UIAlertController, you can use these lines of code:
[[UILabel appearanceWhenContainedIn:[UIAlertController class], nil] setNumberOfLines:2];
[[UILabel appearanceWhenContainedIn:[UIAlertController class], nil] setFont:[UIFont systemFontOfSize:9.0]];
put this in didFinishLaunchingWithOptions method of the AppDelegate.
try this
let alert = UIAlertController(title: title,
message: "you message go here",
preferredStyle:
UIAlertControllerStyle.alert)
let cancelAction = UIAlertAction(title: "Cancel",
style: .cancel, handler: nil)
alert.addAction(cancelAction)
self.present(alert, animated: true, completion: nil)
UILabel.appearance(whenContainedInInstancesOf:
[UIAlertController.self]).numberOfLines = 0
UILabel.appearance(whenContainedInInstancesOf:
[UIAlertController.self]).lineBreakMode = .byWordWrapping
I have a strange visual bug that only affects iOS 9 devices:
My app’s login UIViewController runs off and gets an OAuth token when you hit the button, much like you’d expect. If the response from my API returns a specific status code, I pop up a UIAlertView saying they need to reset their password (this is if they’ve been flagged as such on the server end). The email and password fields for login resignFirstResponder once you hit the button, standard stuff.
On iOS 9 only, if you hit the reset path, the second you tap OK on that alert view, the keyboard pops back up, for maybe 800ms, then dismisses again. It’s almost as if something was queued to present it, but the presence of the alert blocked it until you hit OK – it’s absolutely instantaneous after hitting okay on the alert.
It seems a really tricky one to debug. I’ve added symbolic breakpoints to becomeFirstResponder and it isn’t called anywhere near this process occurring.
Any other ideas for how I can look at debugging / fixing this? It doesn’t affect iOS 7 and iOS 8, only iOS 9.
I faced this problem about 30 minutes ago.
The UIAlertView has been deprecated since iOS9 was released.
We solved this issue by using the UIAlertController, like this:
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:#"Alert Title!" message:#"This is an alert message." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* ok = [UIAlertAction actionWithTitle:#"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:ok];
[self presentViewController:alertController animated:NO completion:nil];
This should fix your problem.
If animated = YES, you may get the same issue as before. This is a bug with iOS9.
Let me know how it goes, and if this fixes your problem.
Here is an extension to handle this in swift 3
extension UIViewController {
func presentOk(with title: String, and message: String, handler: ((UIAlertAction) -> Void)?) {
let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: handler))
OperationQueue.main.addOperation {
self.view.endEditing(true)
self.present(alert, animated: true, completion: nil)
}
}
}
The key is to hide the keyboard and present the controller in the main queue.
Usage
presentOk(with: "My app title", and: "this is the alert message", handler: nil)
How can I build a choice view something like the image below, or the stock picker from Apple for example.
I know I can make the 'normal' UIPickerView but this looks much better.
Try this:
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: nil delegate: nil cancelButtonTitle: #"Cancel" destructiveButtonTitle: nil otherButtonTitles: #"Take photo or video", #"Choose photo",… nil];
[actionSheet showInView: self.view);
or in Swift
UIActionSheet(title: nil,
delegate: nil,
cancelButtonTitle: "Cancel",
destructiveButtonTitle: nil,
otherButtonTitles: "Take photo or video", "Choose photo").showInView(self.view)
How do I add a textfield to the alertview? I'm trying to do an app where before the app commits the editing, the user must authenticate 1st by typing his/her password on the said alertview but how can I do this? It seems like the code I've searched doesn't work anymore. Here it is:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Log In" message:#"Please enter your Password" delegate:self cancelButtonTitle:#"Log In" otherButtonTitles:#"Cancel", nil];
[alert addTextFieldWithValue:#"" label:#"Password"];
UITextField *tf = [alert textFieldAtIndex:0];
tf.clearButtonMode = UITextFieldViewModeWhileEditing;
tf.keyboardType = UIKeyboardTypeAlphabet;
tf.keyboardAppearance = UIKeyboardAppearanceAlert;
tf.autocapitalizationType = UITextAutocapitalizationTypeWords;
tf.autocapitalizationType = UITextAutocorrectionTypeNo;
the error said
"No visible #interface for 'UIAlertView'
declares the selector 'addTextFieldWithValue:label:'"
on the [alert addTextFieldWithValue:#"" label:#"Password"];
I also would like to ask how can I put codes on the Confirm button on the alertview.
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
or if you need it to be secure (for passwords)
alert.alertViewStyle = UIAlertViewStyleSecureTextInput;
Edit:
I'm not 100% sure what you mean by "put codes on the confirm button" but if you want to know whether they pushed confirm or cancel, you only need to implement
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
//check the button index and do something if it's the right one.
}
Adding a textField into an alert view (Swift):
let pincodeAlert:UIAlertController = UIAlertController(title: "Hello", message: "Enter a new passcode", preferredStyle: UIAlertControllerStyle.Alert)
pincodeAlert.addTextFieldWithConfigurationHandler({ (pinCodeTextField:UITextField!) -> Void in
pinCodeTextField.placeholder = "password"
pinCodeTextField.secureTextEntry = true
})
//Add the textField
pincodeAlert.addTextFieldWithConfigurationHandler({ (pinCodeTextField2:UITextField!) -> Void in
pinCodeTextField2.placeholder = "Confirm password"
pinCodeTextField2.secureTextEntry = true
})
pincodeAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
//check entered passcodes
}))
pincodeAlert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))
presentViewController(pincodeAlert, animated: true, completion: nil)
To check the data in the checkBoxes just add this in your "OK" Action handler:
let passcodeEntered:String = (pincodeAlert.textFields?.first as UITextField).text
After a calculation, I want to display a pop up or alert box conveying a message to the user. Does anyone know where I can find more information about this?
Yup, a UIAlertView is probably what you're looking for. Here's an example:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"No network connection"
message:#"You must be connected to the internet to use this app."
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
If you want to do something more fancy, say display a custom UI in your UIAlertView, you can subclass UIAlertView and put in custom UI components in the init method. If you want to respond to a button press after a UIAlertView appears, you can set the delegate above and implement the - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex method.
You might also want to look at the UIActionSheet.
Different people who come to this question mean different things by a popup box. I highly recommend reading the Temporary Views documentation. My answer is largely a summary of this and other related documentation.
Alert (show me an example)
Alerts display a title and an optional message. The user must acknowledge it (a one-button alert) or make a simple choice (a two-button alert) before going on. You create an alert with a UIAlertController.
It is worth quoting the documentation's warning and advice about creating unnecessary alerts.
Notes:
See also Alert Views, but starting in iOS 8 UIAlertView was deprecated. You should use UIAlertController to create alerts now.
iOS Fundamentals: UIAlertView and UIAlertController (tutorial)
Action Sheet (show me an example)
Action Sheets give the user a list of choices. They appear either at the bottom of the screen or in a popover depending on the size and orientation of the device. As with alerts, a UIAlertController is used to make an action sheet. Before iOS 8, UIActionSheet was used, but now the documentation says:
Important: UIActionSheet is deprecated in iOS 8. (Note that UIActionSheetDelegate is also deprecated.) To create and manage action sheets in iOS 8 and later, instead use UIAlertController with a preferredStyle of UIAlertControllerStyleActionSheet.
Modal View (show me an example)
A modal view is a self-contained view that has everything it needs to complete a task. It may or may not take up the full screen. To create a modal view, use a UIPresentationController with one of the Modal Presentation Styles.
See also
Presenting View Controllers from Other View Controllers
Modal Contexts
Popover (show me an example)
A Popover is a view that appears when a user taps on something and disappears when tapping off it. It has an arrow showing the control or location from where the tap was made. The content can be just about anything you can put in a View Controller. You make a popover with a UIPopoverPresentationController. (Before iOS 8, UIPopoverController was the recommended method.)
In the past popovers were only available on the iPad, but starting with iOS 8 you can also get them on an iPhone (see here, here, and here).
See also
View Controllers: Popovers
Notifications
Notifications are sounds/vibrations, alerts/banners, or badges that notify the user of something even when the app is not running in the foreground.
See also
Local and Remote Notification Programming Guide
Simple, interactive notifications in iOS 8
A note about Android Toasts
In Android, a Toast is a short message that displays on the screen for a short amount of time and then disappears automatically without disrupting user interaction with the app.
People coming from an Android background want to know what the iOS version of a Toast is. Some examples of these questions can he found here, here, here, and here. The answer is that there is no equivalent to a Toast in iOS. Various workarounds that have been presented include:
Make your own with a subclassed UIView
Import a third party project that mimics a Toast
Use a buttonless Alert with a timer
However, my advice is to stick with the standard UI options that already come with iOS. Don't try to make your app look and behave exactly the same as the Android version. Think about how to repackage it so that it looks and feels like an iOS app.
Since the release of iOS 8, UIAlertView is now deprecated; UIAlertController is the replacement.
Here is a sample of how it looks in Swift 5:
let alert = UIAlertController(title: "Hello!", message: "Message", preferredStyle: .alert)
let alertAction = UIAlertAction(title: "OK!", style: .default) { (sender: UIAlertAction) -> Void in
// ... Maybe handle "OK!" being tapped.
}
alert.addAction(alertAction)
// Show.
present(alert, animated: true) { () -> Void in
// ... Maybe do something once showing is complete.
}
As you can see, the API allows us to implement callbacks for both the action and when we are presenting the alert, which is quite handy!
For older Swift version:
let alert = UIAlertController(title: "Hello!", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
let alertAction = UIAlertAction(title: "OK!", style: UIAlertActionStyle.default)
{
(UIAlertAction) -> Void in
}
alert.addAction(alertAction)
present(alert, animated: true)
{
() -> Void in
}
Since iOS 8.0, you will need to use UIAlertController as the following:
-(void)alertMessage:(NSString*)message
{
UIAlertController* alert = [UIAlertController
alertControllerWithTitle:#"Alert"
message:message
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction
actionWithTitle:#"OK" style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {}];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}
Where self in my example is a UIViewController, which implements "presentViewController" method for a popup.
For Swift 3 & Swift 4 :
Since UIAlertView is deprecated, there is the good way for display Alert on Swift 3
let alertController = UIAlertController(title: NSLocalizedString("No network connection",comment:""), message: NSLocalizedString("connected to the internet to use this app.",comment:""), preferredStyle: .alert)
let defaultAction = UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .default, handler: { (pAlert) in
//Do whatever you want here
})
alertController.addAction(defaultAction)
self.present(alertController, animated: true, completion: nil)
Deprecated :
This is the swift version inspired by the checked response :
Display AlertView :
let alert = UIAlertView(title: "No network connection",
message: "You must be connected to the internet to use this app.", delegate: nil, cancelButtonTitle: "Ok")
alert.delegate = self
alert.show()
Add the delegate to your view controller :
class AgendaViewController: UIViewController, UIAlertViewDelegate
When user click on button, this code will be executed :
func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
}
Although I already wrote an overview of different kinds of popups, most people just need an Alert.
How to implement a popup dialog box
class ViewController: UIViewController {
#IBAction func showAlertButtonTapped(_ sender: UIButton) {
// create the alert
let alert = UIAlertController(title: "My Title", message: "This is my message.", preferredStyle: UIAlertController.Style.alert)
// add an action (button)
alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))
// show the alert
self.present(alert, animated: true, completion: nil)
}
}
My fuller answer is here.
Here is C# version in Xamarin.iOS
var alert = new UIAlertView("Title - Hey!", "Message - Hello iOS!", null, "Ok");
alert.Show();