How to make UIBarButtonItem give menu-options? - iphone

You know how if you click and hold on a link in Safari (for iPhone obviously) it gives you a list of options like "open in new window", "Open". "Copy" etc?
How do you call this and is it possible to get a UIBarButtonItem to do this (but every time it is clicked not just when held down)?

This is how you show this menu:
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:#"Cancel",
destructiveButtonTitle:nil
otherButtonTitles:#"Button 1", #"Button 2", #"Button 3", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet showInView:[self view]];
[actionSheet release];
In order to connect it to UIBarButtonItem just point the bar button item to a selector that will include the code above.
Don't forget to implement - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex method of UIActionSheetDelegate.

Related

In UIActionSheet the cancel button not showing for iphone?

In my application when I click on change image it's asks UIActionsheet with three actions take photo ,choose from library and cancel.Take photo ,choose from library are showing but cancel didn't showing where is the problem.
this is my code
- (void)viewDidLoad
{
[super viewDidLoad];
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"Select Image from..."
delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"Take Photo", #"Choose from library", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet showInView:self.view];
}
Its because...I think you are using the default view size -Retina 4 full screen as your view size...Just try and change your view size to Retina 3.5 full screen from the Attributes inspector...!!!
You may want to take a look at the alternative methods for presenting an action sheet in the class reference. However, you may want to try using one of the following (if you have a toolbar)
– showFromBarButtonItem:animated:
– showFromToolbar:
Additionally, using the following
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
will only ever result in the action sheets style being default.
try this one...
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"Select Image from..."
delegate:self
cancelButtonTitle:#"Cancel"
destructiveButtonTitle:#"Cancel"
otherButtonTitles:#"Take Photo", #"Choose from library", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet showInView:self.view];
Since your problem is not with your code. Maybe you are using the wrong method to display your UIActionSheet.
A UIActionSheet can be displayed with following methods:
– showFromTabBar:
– showFromToolbar:
– showInView:
– showFromBarButtonItem:animated:
– showFromRect:inView:animated:
take a look at Apple's UIActionSheet reference.
Since you use a TabBar, the Cancel button may also be below. I would test that too.
Please refer this link.
And you can refer below code also, it may help you:
(void)viewDidLoad
{
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:#"Select Image from..." delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"Take Photo", #"Choose from library", nil];
[actionSheet showInView:self.view];
}

UIActionSheet, how to dismiss it with a single click?

UIActionSheet, how to dismiss it with a single click?
I have to click a button 2 times so it gets dismissed, what should I do to make it dismissble after the first click?! Here is my code:
-(void)buttonHeld:(id)sender
{
UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:#"Delete Contact?!" delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:#"Delete" otherButtonTitles: nil];
popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
[popupQuery showInView:self.view];
[popupQuery release];
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
NSLog(#"Delete button clicked Button Clicked");
else if (buttonIndex == 1) {
NSLog(#"Cancel Button Clicked");
}
}
Based on the name of your method "buttonHeld", my assumption is that you are trying to launch the UIActionSheet from a UILongPressGestureRecognizer. You will need to use the code listed below if you want it to work as expected. The problem stems from UILongPressGestureRecognizer being a 'continuous gesture' which fires multiple times and progresses through several different states. You'll need to monitor for the correct state and then load your UIActionSheet. I had the exact same problem and this is what solved it for me.
- (IBAction) buttonHeld:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateBegan) {
UIActionSheet *popupQuery = [[UIActionSheet alloc]
initWithTitle:#"Delete Contact?!"
delegate:self
cancelButtonTitle:#"Cancel"
destructiveButtonTitle:#"Delete"
otherButtonTitles:nil];
popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
[popupQuery showInView:self.view];
}
}
This is how i dismiss the actionsheet...
[actionSheet dismissWithClickedButtonIndex:0 animated:YES];
Hope this helps
It took me a few taps to get it to cancel as well. The problem ended up being which view I attached it to.
[action showInView:self.view];
self.view was only referenced in IB. I changed it to a different view and it worked.
No need to declare in this delegate when you alloc the actionsheet you have make cancel Button that by default dismiss the ActionSheet some thing like this
[[UIActionSheet alloc] initWithTitle:#"" delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:btnTitle,#"Send for a date range",nil];
from any other event you can use this method
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated
In your code there is a syntax error you are putting else block in if block.
If u're developing for the iphone it's always safe to use :
[popupQuery showFromBarButtonItem:sender animated:YES]
or showFromTabBar: or showFromToolBar etc. instead of showinView.

Need help calling a method after pressing a button from a UIActionSheet

I have a UIActionSheet that I am able to successfully call from a UIBarButtonItem in my app. However, when I click on a button that is on the UIActionSheet, the method that I am trying to get it to call does not appear to be called, and the UIActionSheet goes away. My relevant code looks like this:
In my MapViewController.h file:
#interface MapViewController : UIViewController<MKMapViewDelegate, UIActionSheetDelegate>{
In my MapViewController.m file:
-(IBAction)showActionSheet {
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"Share your favourite restaurant with your friends" delegate:nil cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"EMail",#"Facebook",#"Twitter",nil];
[actionSheet showInView:self.view];
[actionSheet release];
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if(buttonIndex == 0)
NSLog(#"You chose email!");
if(buttonIndex == 1)
NSLog(#"You chose facebook!");
if(buttonIndex == 2)
NSLog(#"You chose twitter!");
}
Can anyone see where I am going wrong? My personal hunch is that it may have something to do with how I am implementing the UIActionSheetDelegate interface.
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"Share your favourite restaurant with your friends" delegate:nil cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"EMail",#"Facebook",#"Twitter",nil];
should be
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"Share your favourite restaurant with your friends" delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"EMail",#"Facebook",#"Twitter",nil];
And also make sure your .h file implements the UIActionSheetDelegate protocol
You are passing nil as the delegate, but the delegate is your view controller, so pass self:
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"Share your favourite restaurant with your friends" delegate:self cancelButtonTitle:#"Cancel" destructiveButtonTitle:nil otherButtonTitles:#"EMail",#"Facebook",#"Twitter",nil];
May be you forget to set the delegate , Add below in your code
actionSheet.delegate = self ;
From the Documentation ...
The receiver’s delegate or nil if it doesn’t have a delegate.
#property(nonatomic, assign) id<UIActionSheetDelegate> delegate

iPhone, I want to create a popup menu from my tab bar, but what are they call, like copy / paste?

I'd like to create a popup menu, from my tab bar.
I've seen them, but I'm not sure what they called ?
Kind of like a speak bubble.
I think copy / paste is the sort of thing I mean.
You are searching for the UIMenuController.
This question might help you.
That could be the UIActionSheet. You might want to give it a try.
//Your delegate for pressed buttons.
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
//Your Action for pressed button.
[actionSheet release];
}
//Declare a method to show your sheet
-(void)showActionSheet
{
UIActionSheet *menu = [[UIActionSheet alloc]
initWithTitle: #"Action Sheet Title"
delegate:self
cancelButtonTitle:#"Cancel"
destructiveButtonTitle:#"Delete"
otherButtonTitles:#"Other Button1", #"Other Button2", nil];
[menu showInView:self.view];
}
But you said "bubble", so that could also be the UIAlertView.
Try this:
-(void)showAlertView
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"Alert!"
message:#"This is the message that pops up in the bubble."
delegate:self
cancelButtonTitle:#"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}
On the iPad, you'd want UIPopoverController, but I think that on the iPhone the same sort of interactions are meant to be performed by a separate, full screen controller or by a UIActionSheet. There's no speech bubble on the iPhone such that I'm aware.

How do you create a multi button confirmation on the iPhone?

On the iPhone, in the Calendar App when you press the "Delete Event" button a confirmation slides in from the bottom. Does anyone know of any example code for this, or is it just a short view presented modally with a custom background?
If this is made using a custom view, do you know where I can get a background graphic the same as the one used in the Calendar App?
Thanks in advance!
NB: I am not talking about a UIAlertView dialog box, but the slide-in confirmation with multiple buttons.
UIActionSheet is what you are looking for.
Here is some code example to get you started with:
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"Save photo?" delegate:self cancelButtonTitle:#"No" destructiveButtonTitle:#"Yes" otherButtonTitles:nil];
[actionSheet showInView:self.view];
[actionSheet release];
This will slide in an action sheet from the bottom. It has 2 buttons. Yes and No.
When a user selects any button the actionSheet:didDismissWithButtonIndex: method gets called
-(void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex{
//your code here
}
Your controller class will have to subscribe to the < UIActionSheetDelegate > protocol
Hope this helps!
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:#"title" delegate:self cancelButtonTitle:#"cancel" destructiveButtonTitle:#"destructive" otherButtonTitles:#"other", nil];
[actionSheet showInView:self.view];
[actionSheet release];