4

我有一个带有 4 个按钮(主页、访问、分享、更多)的标签栏。我希望标签栏中的“共享”按钮调用一个操作表,该操作表具有适当的按钮来选择我希望用户能够分发到应用程序的链接(Facebook、Twitter、电子邮件等)的特定渠道。

我可以使用 Storyboard 来做到这一点,但我必须创建一个独特的(空白)视图控制器,该控制器链接到选项卡栏中的“共享”按钮。我将以下代码放在 viewDidAppear 方法中,以在选择“共享”按钮时显示操作表:

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];
}

当我关闭操作表时,我会默认返回主视图:

[self.tabBarController setSelectedIndex:0];

虽然这可行,但从用户的角度来看并不是最佳的。我希望操作表出现在选择“共享”按钮时显示的特定视图上。例如,如果用户在“访问”视图上并从选项卡栏中选择了“共享”,我希望操作表显示在访问视图的顶部,并且该视图在操作表后面可见。

我可以使用 Storyboard 实现这一目标吗?或者我需要一个自定义标签栏来实现这个功能吗?如果需要自定义选项卡栏,我将不胜感激有关如何实现包括自定义选项卡栏以及选项卡栏的操作表的指导/见解。

提前致谢!

4

2 回答 2

1

我也需要这个,搜索了一下,最终在 UITabBarController 上构建了以下类别。

让操作表出现在当前选项卡上的技巧是您永远不想实际访问该操作表呈现选项卡。使用启动操作表的 UIButton 覆盖该位置的选项卡栏。

像往常一样在情节提要中绘制标签栏,在发生特殊行为的位置留下一个空栏项目。然后添加这个类别...

//  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];
}

使用 index < tabBar.items.count 和按钮的图像调用它。如果是你应用的根vc,你可以这样调用它:

#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;
}
于 2012-12-19T03:31:01.447 回答
0

而不是从标签栏打开操作表

[actionSheet showFromTabBar:self.tabBarController.tabBar];

使用此代码。

[actionSheet showInView:[UIApplication sharedApplication].keyWindow];
于 2013-04-26T12:10:33.243 回答