How to show the actionSheet originating from UiButton - objective-c

I have a uiButton and i want to show a action sheet originating from it.
This is my code for close button,
+ (void)addLeftButton:(UINavigationItem *)navItem withTarget:(id) navTarget
{
UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
[fixedSpace setWidth:-5];
UIImage *buttonImage = [UIImage imageNamed:#"close-button.png"];
UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeCustom];
[closeButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
closeButton.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
UIBarButtonItem *aBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:closeButton];
[closeButton addTarget:navTarget action:#selector(didSelectCloseButton:) forControlEvents:UIControlEventTouchUpInside];
[navItem setLeftBarButtonItems:[NSArray arrayWithObjects:fixedSpace,aBarButtonItem,nil]];
}
This IBAction for the close button,
(IBAction)didSelectCloseButton:(id)sender
{
if([self->_customer getCheckInDraft])
{
[self showActionSheet:sender];
}
and in showActionSheet I have this code,
(void) showActionSheet:(id)sender
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
[self->_actionSheet showFromBarButtonItem:sender animated:YES];
}
//Here the showFromBarButtonItem gets the sender as uiButton but it crashes.on clicking the Close button the app crashes.

Here is action sheet code.
- (IBAction)showActionSheet:(id)sender {
/* Dismiss keyboard*/
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"What ever you want to ask?" delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:#"Delete it" otherButtonTitles:#"Copy", #"Duplicate", nil]; //Change the options that you want to display as per your requirement.
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// In this case the device is an iPad.
[actionSheet showFromRect:[(UIButton *)sender frame] inView:self.view animated:YES];
}
else{
// In this case the device is an iPhone/iPod Touch.
[actionSheet showInView:self.view];
}
}
#pragma mark - UIActionSheet method implementation
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
NSLog(#"Index = %d - Title = %#", buttonIndex, [actionSheet buttonTitleAtIndex:buttonIndex]);
}
-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex{
NSLog(#"Action sheet did dismiss");
}
-(void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex{
NSLog(#"Action sheet will dismiss");
}
/* UPDATE */
Above is deprecated in iOS 8.3 and above so you could use below UIAlertController.
Also if your keyboard is open while user tap on button then the keyboard dismiss automatically and let the UIAlertController show options.
UIAlertController *alertController;
UIAlertAction *destroyAction;
UIAlertAction *otherAction;
alertController = [UIAlertController alertControllerWithTitle:nil
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
destroyAction = [UIAlertAction actionWithTitle:#"Remove All Data"
style:UIAlertActionStyleDestructive
handler:^(UIAlertAction *action) {
// do destructive stuff here
}];
otherAction = [UIAlertAction actionWithTitle:#"Blah"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *action) {
// do something here
}];
// note: you can control the order buttons are shown, unlike UIActionSheet
[alertController addAction:destroyAction];
[alertController addAction:otherAction];
[alertController setModalPresentationStyle:UIModalPresentationPopover];
UIPopoverPresentationController *popPresenter = [alertController
popoverPresentationController];
UIButton *btn = (UIButton *)sender;
popPresenter.sourceView = btn;
popPresenter.sourceRect = [btn bounds];
[self presentViewController:alertController animated:YES completion:nil];

You can do it like that:
UIAlertAction *action1;
UIAlertAction *actionCancel;
action1 = [UIAlertAction actionWithTitle:#"action1" style:UIAlertActionStyleDefault handler:nil];
actionCancel = [UIAlertAction actionWithTitle:#"cancel" style:UIAlertActionStyleDestructive handler:nil];
UIAlertController *alertView = [UIAlertController alertControllerWithTitle:#"alert" message:nil preferredStyle:UIAlertControllerStyleActionSheet];
alertView.modalPresentationStyle = UIModalPresentationPopover; // for iPad
[alertView addAction:action1];
[alertView addAction:actionCancel];
if (viewSourse) { // Here your button
alertView.popoverPresentationController.sourceView = viewSourse;
alertView.popoverPresentationController.sourceRect = CGRectMake(viewSourse.frame.size.width/2, viewSourse.frame.size.height/2, 0, 0);
}
[self presentViewController:alertView animated:YES completion:nil];

Related

iOS 11 UIAlertview not show full Message

I try to make a Popup for my app with UIAlertView. This Popup display fine on iOS 10 or older but on iOS 11 it doesn't display all the content of the popup. What can I do to fix that error!?
And this is the code that I am using to make the custom UAlertView. Any ideas?
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:nil delegate:self cancelButtonTitle:NSLocalizedString(#"ok", nil) otherButtonTitles: nil];
UILabel *lbl = [[UILabel alloc]initWithFrame:CGRectMake(0,0, 900, 900)];
[lbl setAttributedText:getPopUp];
[lbl setNumberOfLines:0];
[lbl sizeToFit];
[lbl setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:#"bg-popup-2.png"]]];
[alert setValue:lbl forKey:#"accessoryView"];
[alert show];
Sorry for my poor English!
Regards! thanks for all your help!!
Use UIAlertController instead of UIAlertView.
UIAlertController * alert= [UIAlertController
alertControllerWithTitle:title //alert Title
message:getPopUp //Your Message
preferredStyle:UIAlertControllerStyleAlert];
UIView *firstSubview = alert.view.subviews.firstObject;
UIView *alertContentView = firstSubview.subviews.firstObject;
for (UIView *subSubView in alertContentView.subviews) {
subSubView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:#"bg-popup-2.png"]];
}
UIAlertAction* ok = [UIAlertAction
actionWithTitle:#"OK"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:ok];
[self presentViewController:alert animated:YES completion:nil];
Hope this will help you.
For more details: http://hayageek.com/uialertcontroller-example-ios/
UIAlertView has been deprecated. Instead of using UIAlertView you should use UIAlertController like this :-
UIAlertController *alertController=[UIAlertController alertControllerWithTitle:#"Title" message:#"message" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *actionOk=[UIAlertAction actionWithTitle:#"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//Ok Button Code
}];
UIAlertAction *actionCancel=[UIAlertAction actionWithTitle:#"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
//Cancel Button Code
}];
[alertController addAction:actionOk];
[alertController addAction:actionCancel];
[self presentViewController:alertController animated:YES completion:nil];

How to give toast message in objective c

I am trying to give a toast message when users login and user will able to see a toast message saying New Data Available and the button beneath that says Download and Cancel.But when Download comes its font Coming in BOLD.PLease let me know how can i make this look in normal by default fonts
Code as follows:
UIAlertView* alert = [[UIAlertView alloc]initWithTitle:msg message:#""delegate:self cancelButtonTitle:#"Download" otherButtonTitles: #"Ignore",nil];
I need the Download should Come in normal fonts in toast message.
I have a Simple code to giving Toast.
- (void) ShowAlert:(NSString *)Message {
UIAlertController * alert=[UIAlertController alertControllerWithTitle:nil
message:#""
preferredStyle:UIAlertControllerStyleAlert];
UIView *firstSubview = alert.view.subviews.firstObject;
UIView *alertContentView = firstSubview.subviews.firstObject;
for (UIView *subSubView in alertContentView.subviews) {
subSubView.backgroundColor = [UIColor colorWithRed:141/255.0f green:0/255.0f blue:254/255.0f alpha:1.0f];
}
NSMutableAttributedString *AS = [[NSMutableAttributedString alloc] initWithString:Message];
[AS addAttribute: NSForegroundColorAttributeName value: [UIColor whiteColor] range: NSMakeRange(0,AS.length)];
[alert setValue:AS forKey:#"attributedTitle"];
[self presentViewController:alert animated:YES completion:nil];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[alert dismissViewControllerAnimated:YES completion:^{
}];
});
}
Use
[self ShowAlert:#"Please Enter Your Good Name."];
check it
UIAlertController* alert = [UIAlertController
alertControllerWithTitle:#"your text"
message:nil
preferredStyle:UIAlertControllerStyleActionSheet];
[self performSelector:#selector(abc:) withObject:alert afterDelay:2];
UIAlertAction* ok = [UIAlertAction
actionWithTitle:#"Download"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
}];
UIAlertAction* cancel = [UIAlertAction
actionWithTitle:#"cancel"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
}];
[alert addAction:ok];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil]
;
delegate method for automatic disappear
-(void)abc:(UIAlertController*)x{
[x dismissViewControllerAnimated:YES completion:nil];
}
As per your requirement you need to create one custom Alert View which match your expectations.
For you reference you can choose custom alerts which allow features which you want. (see example links below)
1) Example_1: https://github.com/cs-joao-souza/JPAlertController
2) Example_2: https://github.com/kubacizek/ScrollableDisclaimerAlert
3) Example_3: https://github.com/gokulgovind/GLInAppPurchase
Hope it helps.

Why error is showing on click of button?

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates when I am using UIActionsheet on click of button in ios? Why?
- (IBAction)btnAboutUsActions:(UIButton *)sender
{
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: nil
delegate:self
cancelButtonTitle: nil
destructiveButtonTitle: nil
otherButtonTitles: #"Achievment",
#"Brown Story", nil];
actionSheet.tag = 100;
[actionSheet showFromRect: sender.frame inView: sender.superview animated: YES];
}
Use alertController
UIAlertController *alert = [UIAlertController alertControllerWithTitle:confirmText message:#"" preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *achievment = [UIAlertAction actionWithTitle:#"Achievment"
style:UIAlertActionStyleDefault
handler:nil];
[alert addAction: achievment];
[self presentViewController:alert animated:YES completion:nil];
[alert.view layoutIfNeeded]

how to pass parameter on completion block in objective-c

I am trying to declare a function with couple of blocks inside it, when I will call the function from viewdidload method, these parameters should perform accordongly
-(void) alertViewOn:(UILabel*)LabelTextX :(UIButton*)ButtonA :(UIButton*)ButtonB :(UIImage*)ImageX {
UIAlertController* alert = [UIAlertController alertControllerWithTitle:#"Enter Pet Name" message:nil preferredStyle:UIAlertControllerStyleAlert];
//Show TextField
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField)
{
textField.placeholder = NSLocalizedString(#"Pet Name", #"Name");
}];
//Set Ok Button
UIAlertAction* ok = [UIAlertAction actionWithTitle:#"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
[alert dismissViewControllerAnimated:YES completion:nil];
UITextField *textField = alert.textFields.firstObject;
self.labelText2.text = textField.text;
}];
[alert addAction:ok];
//Set ADD Button
UIAlertAction* addPet = [UIAlertAction actionWithTitle:#"Add More" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
[alert dismissViewControllerAnimated:YES completion:nil];
self.button4.hidden = NO;
self.button5.hidden = NO;
self.image2.hidden = NO;
}];
[alert addAction:addPet];
//Set Cancel Button
UIAlertAction* cancel = [UIAlertAction actionWithTitle:#"Cancel" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action){
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil];
}
Here I want to pass the parameter LabelTextX to labelText2 ; ButtonA to button4 ; ButtonY to button5 and ImageX to image2 . I am totally new in objective-c and finding it difficult even to declare a function !!! Please any kind person help ....
-(void) alertViewOn:(UILabel*)LabelTextX :(UIButton*)ButtonA : (UIButton*)ButtonB :(UIImageView*)ImageX {
UIAlertController* alert = [UIAlertController alertControllerWithTitle:#"Enter Pet Name" message:nil preferredStyle:UIAlertControllerStyleAlert];
//Show TextField
[alert addTextFieldWithConfigurationHandler:^(UITextField *textField)
{
textField.placeholder = NSLocalizedString(#"Pet Name", #"Name");
}];
//Set Ok Button
UIAlertAction* ok = [UIAlertAction actionWithTitle:#"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
[alert dismissViewControllerAnimated:YES completion:nil];
UITextField *textField = alert.textFields.firstObject;
LabelTextX.text = textField.text;
}];
[alert addAction:ok];
//Set ADD Button
UIAlertAction* addPet = [UIAlertAction actionWithTitle:#"Add More" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
[alert dismissViewControllerAnimated:YES completion:nil];
ButtonA.hidden = NO;
ButtonB.hidden = NO;
ImageX.hidden = NO;
}];
[alert addAction:addPet];
//Set Cancel Button
UIAlertAction* cancel = [UIAlertAction actionWithTitle:#"Cancel" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action){
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:cancel];
[self presentViewController:alert animated:YES completion:nil];
}
And then called the function like this ...
- (IBAction)buttonPressed15:(id)sender {
[self alertViewOn:_labelText15 :_button30 :_button31 :_image15];
}

Actionsheet buttons do not respond when using showInView

I have this code on my program
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *saveMessageBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[saveMessageBtn setImage:[UIImage imageNamed:#"btn_done.png"] forState:UIControlStateNormal];
[saveMessageBtn addTarget:self action:#selector(saveMessage) forControlEvents:UIControlEventTouchUpInside];
[saveMessageBtn setFrame:CGRectMake(0, 0, 49, 30)];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:saveMessageBtn];
}
-(IBAction)saveMessage:(id)sender{
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:nil cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"Send Now",#"Non Recurring",#"Recurring", nil];
[actionSheet showInView:self.view];
}
- (void)actionSheet:(UIActionSheet *) actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0){
NSLog(#"Send Now");
}
else if (buttonIndex == 1){
[self performSegueWithIdentifier:#"modalNonRecurring" sender:self];
}
else if (buttonIndex == 2){
[self performSegueWithIdentifier:#"modalRecurring" sender:self];
}
else{
NSLog(#"Cancel Clicked");
}
}
as you can see in the code, it supposed to perform a segue or do 'NSLog' when a particular button clicked.
But when I click a button, it does not perform what I want it to do, instead it displays this message in the debug area..
Presenting action sheet clipped by its superview. Some controls might not respond to touches. On iPhone try -[UIActionSheet showFromTabBar:] or -[UIActionSheet showFromToolbar:] instead of -[UIActionSheet showInView:].
By the way, I am using a UINavigationController that is inside a UITabBarController.
Anyone that has a great idea how to fix this? your help would be much appreciated. Thanks!
Add UIActionSheetDelegate delegate in .h file and try like this then it'l work.
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:nil cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"Send Now",#"Non Recurring",#"Recurring", nil];
actionSheet.delegate = self;
[actionSheet showInView:self.view];