Llamar a una hoja de acción desde un tabbar

Tengo una barra de tabs con 4 botones (Inicio, Visitas, Compartir, Más). Quiero que el button "Compartir" en mi barra de tabs llame a una hoja de acciones que tiene los botones apropiados para seleccionar los canales particulares. Deseo que el usuario pueda distribuir enlaces a la aplicación (Facebook, Twitter, Correo electrónico, etc.).

Puedo hacer esto usando Storyboard pero tengo que crear un controller de vista único (en blanco) que esté vinculado al button "Compartir" en la barra de tabs. Puse el siguiente código dentro del método viewDidAppear para mostrar la hoja de acciones cuando se selecciona el button "Compartir":

int selectedTab = self.tabBarController.selectedIndex; if (selectedTab == 2) { UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Share Your Visit with Friends!" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Facebook", @"Twitter", @"Email eduLaunchpad", nil]; [actionSheet showFromTabBar:self.tabBarController.tabBar]; } 

Cuando cierro la hoja de acciones, luego return por defecto a la vista de inicio:

 [self.tabBarController setSelectedIndex:0]; 

Si bien esto funciona, no es óptimo desde la perspectiva del usuario. Preferiría que la hoja de acciones aparezca sobre la vista particular que se mostraba cuando se seleccionaba el button "Compartir". Por ejemplo, si el usuario estaba en la vista "Visitas" y seleccionó "Compartir" en la barra de tabs, me gustaría que la hoja de acciones aparezca en la parte superior de la vista de visitas, con esa vista visible detrás de la hoja de acciones.

¿Puedo lograr esto usando Storyboard? ¿O necesito una barra de tabs personalizada para implementar esta funcionalidad? Si se requiere una barra de tabs personalizada, agradecería alguna guía / idea sobre cómo implementar eso, incluyendo la barra de tabs personalizada así como la hoja de acciones de la barra de tabs.

¡Gracias por adelantado!

Necesitaba esto, también, search en Google, y, finalmente, creo la siguiente categoría en UITabBarController.

El truco para que la hoja de acción aparezca en la pestaña actual es que nunca quieres visitar esa pestaña de presentación de la hoja de acción. Cubra la barra de tabs en esa position con un button UIB que inicia la hoja de acción.

Pinte su barra de tabs como lo haría normalmente en el guión gráfico, dejando un elemento de barra vacía en la position donde se producirá el comportamiento especial. Luego agrega esta categoría …

 // UITabBarController+Button.h @interface UITabBarController (Button) <UIActionSheetDelegate> - (void)replaceItemAtIndex:(NSUInteger)index withButtonImage:(UIImage*)buttonImage; @end // UITabBarController+Button.m #import "UITabBarController+Button.h" #define kBUTTON_TAG 4096 @implementation UITabBarController (Button) - (void)replaceItemAtIndex:(NSUInteger)index withButtonImage:(UIImage*)buttonImage { UIButton *button = (UIButton *)[self.view viewWithTag:kBUTTON_TAG]; if (!button) { button = [UIButton buttonWithType:UIButtonTypeCustom]; button.tag = kBUTTON_TAG; [button setBackgroundImage:buttonImage forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; UITabBar *bar = self.tabBar; CGFloat width = bar.frame.size.width / bar.items.count; button.frame = CGRectMake(index*width, bar.frame.origin.y, width, bar.frame.size.height); [self.view addSubview:button]; } } #pragma mark - Handle button tap - (void)buttonTapped:(id)sender { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Action Sheet:" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Action A", @"Action B", @"Action C", nil]; [sheet showFromTabBar:self.tabBar]; } 

Llámalo con un índice <tabBar.items.count y una image para el button. Si es el file raíz de tu aplicación, puedes llamarlo de la siguiente manera:

 #import "the category i suggest above" - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // whatever else you do in here, then NSLog(@"%@", self.window.rootViewController); // make sure this is a UITabBarController // if it is, then ... UITabBarController *tbc = (UITabBarController *)self.window.rootViewController; [tbc replaceItemAtIndex:2 withButtonImage:[UIImage imageNamed:@"some image name"]]; return YES; } 

En lugar de abrir la hoja de acciones desde tabbar

 [actionSheet showFromTabBar:self.tabBarController.tabBar]; 

usa este código

 [actionSheet showInView:[UIApplication shanetworkingApplication].keyWindow];