按下标签栏项目时如何显示警报视图以及在其他目标中使用时如何忽略它?

Posted

技术标签:

【中文标题】按下标签栏项目时如何显示警报视图以及在其他目标中使用时如何忽略它?【英文标题】:How to show alert view when tab bar item is pressed and how to ignore it when used in a other target? 【发布时间】:2013-12-12 11:47:08 【问题描述】:

我有一个带有 5 个标签的 UITabBar 项目。 我正在制作 2 个目标版本:免费版和付费版。

在免费版本中,当用户尝试导航到标签项索引 3 或 4 时,UIAlertView 应该会出现一个基本消息,例如:

要升级吗? 是/取消

当按下Cancel 按钮时,视图应该转到第一个视图控制器。 我该怎么做?

另外,我的下一个问题(我知道我应该在 Stack 中提出另一个问题)是如何防止 UIAlertView 出现在付费版本中?

我已经将UIAlertView 的按钮用于选项卡项 3 和 4 ,但我不希望这样。

这两个目标运行良好,我使用以下代码:

- (IBAction)openAlert:(id)sender

#ifdef FREE

    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Attention" 
                                                       message:@"Choose option" 
                                                      delegate:self
                                             cancelButtonTitle:@"Cancel"
                                             otherButtonTitles:@"Download Full version", nil];
    [alertView show];

#endif


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    if (buttonIndex ==1) 
        [[UIApplication sharedApplication]openURL:[NSURL URLWithString:[NSString  stringWithFormat:@"http://***.com"]]];
    

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在取消时,要移动到另一个UIViewController,您只需更改self.tabBarController 对象的setSelectedIndex

示例:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    switch (buttonIndex) 
        case 0:
            //Cancel button was clicked
            [self.tabBarController setSelectedIndex:0];
        break;
        case 1:
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString  stringWithFormat:@"http://***.com"]]];
        break;
    


至于免费与付费,它是基于意见的。 一种基本的方法是使用NSUserDefaults 来记住应用程序是免费版还是付费版,并相应地处理您的逻辑。

【讨论】:

您的解决方案做到了!正是我想要的。在我的付费版本中,由于#ifdev FREE ,#endif 声明,没有显示警报视图。非常感谢,你拯救了我的一天!大投票 @jOnoMato :不客气。好吧...您实际上可以投票赞成这个答案(如果需要)-(在此答案的左侧,单击Up 箭头。要投赞成票,也请单击Checkmark 接受此回答......它增加了回答你问题的人的声誉)试试吧;):P 我的名声还需要增长,但我检查了你的答案,再次感谢,我很高兴。【参考方案2】:

将你的 appdelegate 设置为你的 tabbar 控制器的委托,并在 appdelegate 或任何地方完成这项工作

    当用户按下取消按钮然后调用

[yourTabbarController setSelectedIndex:0]

    在以下委托方法中编写代码以避免在特定版本(付费/免费)中出现警报
(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item

【讨论】:

感谢 Jailani 抽出宝贵时间处理此事。 staticVoidMan 的解决方案立即为我工作。不过,我会记住你的答案。【参考方案3】:

对于第一个问题,你需要利用(void)alertView: (UIAlertView )alertView clickedButtonAtIndex:(NSInteger)buttonIndex里面的alert视图中点击按钮的索引值,检查按下的按钮的索引是否与取消按钮的索引相同。然后您可以通过编程方式按下所需视图的选项卡并转到该视图。

在加载弹出式警报之前,请检查应用的状态(付费或免费)。您可以通过两种方式进行检查,一种是将设备上的应用程序购买状态存储在NSUserDefaults中,另一种是通过服务器身份验证,尽管服务器身份验证会妨碍应用程序的使用,因为它需要一些时间才能从服务器获得响应,并且在没有网络连接的情况下,用户将无法使用应用程序的付费功能。

如果应用程序具有所需的付费状态,只需加载付费选项卡中的视图,否则只会显示黑屏。

您可以在付费选项卡的视图控制器中实现此检查。在viewWillAppear 中,执行此检查以获取付款状态,然后如果应用程序不是付费应用程序,则显示黑色视图并显示警报消息。否则,如果应用付费,业务照常进行。

【讨论】:

非常感谢您深入探讨这个问题。我坚持使用 staticVoidMan 的答案,但我会记住你的答案。

以上是关于按下标签栏项目时如何显示警报视图以及在其他目标中使用时如何忽略它?的主要内容,如果未能解决你的问题,请参考以下文章

按下标签栏项目时如何关闭视图?

如何在 iOS 6 GM 中的标签栏应用程序中使旋转正常工作?

如何从“更多”标签栏项目中的编辑检测标签栏项目更改?

目标C - 再次点击标签栏项目时,如何再次重新加载网页视图?

目标C - 再次点击标签栏项目时,如何重新加载网页视图?

在 webview 上刷新标签栏项目