导航栏按钮的封装和定时弹窗求好评

第一次完成领导布置的任务是两个很简单的功能,但是我也是个比较追求完美的boy,所以在写代码的过程中有很多的思考,最终完成的还是比较满意,我把相关思路和代码整理一下,如果各位大牛有好的思路和方法,请多多指导,在下小白一个。

导航栏添加按钮

主要对方法进行了一些封装,写在一个分类当中,方便以后创建创建其他导航按钮。

//写在interface文件中的

#import 

@interface UIBarButtonItem (XHHExtension)


//iOS9以后新特性,泛型,__kindof 比instance和id 多了一个敲代码时候提示的功能,提高阅读性

+(__kindof UIBarButtonItem *)itemWithImage:(NSString *)image highImage:(NSString *)highImage target:(id)target action:(SEL)action;

//参数:两种状态下的image图片,target:监听按钮点击的对象,action:点击方法

//1.用itemWithImage 作为方法名比较符合书写规范
//2.这里用`__kindof` 是采用了iOS9以后的新特性,可以代替`instanstype`作为返回类型,同时在写代码的时候会有类型提示,提高代码阅读性。

@end


//写在implementation文件中的代码:

#import "UIBarButtonItem+XHHExtension.h"

@implementation UIBarButtonItem (XHHExtension)

+(UIBarButtonItem *)itemWithImage:(NSString *)image highImage:(NSString *)highImage target:(id)target action:(SEL)action {
    
//创建一个自定义button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
//设置两种状态下的图片
    [button setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
    [button setImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];
//添加点击事件
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
//自适应尺寸
    [button sizeToFit];
//这个方法是UIBarButtonItem的初始化方法,用一个自定义的View初始化。
    return [[self alloc]initWithCustomView:button];
   
}
@end

//在创建的时候有个坑

如果在创建的navigation当中直接设置titleView或者UIBarButtonItem,是没有效果的,
需要在根控制器中进行设置。这点之前没注意到,怪不得写的时候显示不出来,郁闷的很。

//设置按钮就比较简单了,不用贴出代码

定时弹窗求好评

需求是:在使用APP的时候弹窗即可,不需要用户强制弹窗求好评。
我的思考:

  1. 首先设置AlertController,添加需要设置的功能键
  • 如果是多次弹窗(影响用户体验,说不定就给你卸载了)可以使用定时器,放在首页控制器当中。
  • 一次弹窗,简单点就直接使用GCD即可,dispatch_after设置一个延时即可

//具体代码如下

#pragma mark -
#pragma mark - 弹窗求好评
-(void)setupAlertVC {
    
    //创建控制器
    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"喵呜~用的怎么样?如果还行,点个赞吧,五星好评送好礼~" message:nil preferredStyle:UIAlertControllerStyleAlert];
    
    //添加行为
    UIAlertAction *act1 = [UIAlertAction actionWithTitle:@"五星好评送好礼" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        
        //跳转APP Store
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:share_appDownloadUrl]]; 
// share_appDownloadUrl 这个是自己定义的链接
    }];
    
    UIAlertAction *act2 = [UIAlertAction actionWithTitle:@"我要吐槽" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        //跳转APP Store
         [[UIApplication sharedApplication] openURL:[NSURL URLWithString:share_appDownloadUrl]];
    }];
    
    UIAlertAction *act3 = [UIAlertAction actionWithTitle:@"有空再说" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        //就算是有空再说也要跳转APP Store!
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:share_appDownloadUrl]];
    }];
    
    //利用KVC个性化定制action的标题颜色,给用户心理暗示
    [act2 setValue:[UIColor grayColor] forKey:@"_titleTextColor"];
    [act3 setValue:[UIColor grayColor] forKey:@"_titleTextColor"];
    
    //添加行为到弹窗控制器
    [alertVC addAction:act1];
    [alertVC addAction:act2];
    [alertVC addAction:act3];
    
    [self presentViewController:alertVC animated:YES completion:nil];
    
}

//弹窗用的定时器,主页启动以后过了5分钟弹框一次
-(void)setupTimer {
    
    //1.GCD 只弹窗一次
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * 60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self setupAlertVC];
    });


    //2.NSTimer 可能以后需要多次弹窗,就用NSTimer
    //考虑到timer中设置block的方法是iOS10.0之后   在这里用之前方法
//    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10 * 60 target:self selector:@selector(setupAlertVC) userInfo:nil repeats:YES];
//    [timer fire];
    
//  如果用计时器,在action方法中加一个"不再提示" [timer invalidate]; 并用偏好设置储存.
}

更新 : 老板看了以后需要调整和修改,并且把弹窗抽取成一个工具类

所以修改过后是这样的:

需求

  1. 根据版本号判断是否需要弹窗,并且结合之前点击的效果,如果好评过了,就不用弹窗了,否则继续弹窗
  • 弹窗在程序启动一分钟之后进行

代码这么写:

//工具类 XHHAlertManager
直接弄个类方法,设置弹窗


@implementation XHHAlertManager

+(void)showAlertVC {
    
    //读取存储在配置文件中的版本信息,如果跟当前的版本号相同,就直接返回
    NSString *myVersion = [[NSUserDefaults standardUserDefaults]objectForKey:@"xhh_currentVersion"];
    
    //判断当前版本号
    NSDictionary *infoDic = [[NSBundle mainBundle]infoDictionary];
    NSString *currentVersion = [infoDic objectForKey:@"CFBundleShortVersionString"];
    NSLog(@"%@", currentVersion);
    
    //看是否相同
    if ([myVersion isEqualToString:currentVersion]) {
        return;
    }
    
    //不同或者是第一次下载APP,就创建弹框窗口,并且弹框
    //创建控制器
    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"喵呜~用的怎么样?如果还行,点个赞吧,五星好评送好礼~" message:nil preferredStyle:UIAlertControllerStyleAlert];
    
    //添加行为
    UIAlertAction *act1 = [UIAlertAction actionWithTitle:@"五星好评" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        
        //跳转APP Store
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:share_appDownloadUrl]];
        
        //如果是好评了以后才将版本号储存到个人偏好中,其他选项不储存,以后还会弹框
        [[NSUserDefaults standardUserDefaults]setObject:currentVersion forKey:@"xhh_currentVersion"];
    }];
    
    
    UIAlertAction *act3 = [UIAlertAction actionWithTitle:@"有空再说" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        //推出弹窗
    }];
    
    //利用KVC个性化定制action的标题颜色,给用户心理暗示
    
    [act3 setValue:[UIColor grayColor] forKey:@"_titleTextColor"];
    
    //添加行为到弹窗控制器
    [alertVC addAction:act1];
    [alertVC addAction:act3];
    
    //获取window的根控制器
   UIViewController *VC = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    //程序启动后一分钟弹出窗口
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        
        [VC presentViewController:alertVC animated:YES completion:nil];
        
    });
    

}

@end

  • 这里需要添加一个知识点

获取当前的版本号,并进行判断

//首先要清楚版本号在plist文件中的具体内容

在提交更新的app至appstore中时,需要在**.plist中设置app的version信息。
首先调整plist文件的相关值

导航栏按钮的封装和定时弹窗求好评_第1张图片
调整info.Plist文件的原始值

Bundle versions string, short --- CFBundleShortVersionString 面向用户市场的束的版本字符串--用户看到的版本号; //我在代码中采用的是市场的版本号
Bundle version --- CFBundleVersion 应用程序版本号,每次部署应用程序的一个新版本时,将会增加这个编号,在app store上用的---真实版本号,用来判断版本信息的。
//具体的步骤是:

//1. 先找到info.plist文件,他是一个字典
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
//2.根据键值对取出当前APP版本号
NSString *currentVersion = [infoDic objectForKey:@"CFBundleShortVersionString"];

最后在AppDelegate中的didFinishLaunching方法中实现方法调用
[XHHAlertManager showAlertVC]; 即可实现功能

导航栏按钮的封装和定时弹窗求好评_第2张图片

你可能感兴趣的:(导航栏按钮的封装和定时弹窗求好评)