美文网首页
一个项目的总结吧

一个项目的总结吧

作者: 一米押金 | 来源:发表于2019-04-25 11:02 被阅读0次

    1.之前的全屏手势操作似乎变得无效了,其实查不到什么原因,我也不知道是怎么了,所以最后的调试方法就是找了个轮子,导入进去就可以全屏手势了(也可能被其他库给稀释了,毕竟是二次开发项目):

    FDFullscreenPopGesture
    

    注意的操作就是隐藏导航栏的时候

        // 这是由于用了第三方库,导致一直被隐藏,也可能是因为此,导致bartintColor有问题(要导入上面那个库的包)
         self.fd_prefersNavigationBarHidden = YES;
    

    在某些位置禁止全屏手势(也要导包)

         // 这个页面由于一些问题,禁止侧滑
         self.fd_interactivePopDisabled = YES;
    

    至于scrollView无法侧滑的bug,我根据查询的资料调试依旧没有效果,属于待解决的方案

    2.手机宽高问题

    我用的是苹果7按照比例来说应该是(375 * 667),但是手机运行的时候是320*568,但是我用苹果8p模拟器的时候又展示的是手机本身的尺寸,莫非我买了一个假的苹果手机?

    在查询了网站上的问题之后,有说是因为没有lauchImage导致的,或者说lauchImage尺寸问题导致的,这个,我已经没有办法考证了,目前自闭中。。。

    3.一直提到的Cell复用问题,这个属于老生长谈的问题了,Cell复用问题我用的解决办法都是“模型法则”,一个Cell针对一个模型这样子的处理方式,但是偶尔还是会出现复用的时候,比方说展示帖子列表的时候,出现了复用,针对这个情况,一定要冷静分析,到底是为什么出现了这个复用问题,用图层查看器查看一下,分析一下原因,相信应该会找出来答案的

    -(void)setupImageView:(NSInteger)count{
         // 原因は セイルの リウス クリエイト ノ バグ
         for (UIImageView *imgView in self.pictureView.subviews) {
              [imgView removeFromSuperview];
         }
    
         int maxColumns = 3;
         CGFloat IWPhotoMargin = 10;
         CGFloat leftRightMargin = 13;
         CGFloat IWPhotoW = (kScreenW - leftRightMargin * 4)/3;
         CGFloat IWPhotoH = 78 * IWPhotoW / 110;
         // 初始化9个子控件
         for (int i = 0; i<count; i++) {
              UIImageView *photoView = [[UIImageView alloc] init];
              photoView.userInteractionEnabled = YES;
              photoView.tag = i + 100;
    
              NSURL *url = [NSURL URLWithString:self.pictures[i]];
              [photoView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"shequdefault"]];
    
              [photoView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(photoTap:)]];
              // 设置子控件的frame
              int col = i % maxColumns;
              int row = i / maxColumns;
              CGFloat photoX = col * (IWPhotoW + IWPhotoMargin);
              CGFloat photoY = row * (IWPhotoH + IWPhotoMargin);
              photoView.frame = CGRectMake(photoX, photoY, IWPhotoW, IWPhotoH);
              [self.pictureView addSubview:photoView];
         }
    
         if (self.pictures.count == 0) {
            self.pictureViewHConstraint.constant = 0;
         }else if (self.pictures.count <= 3){
            self.pictureViewHConstraint.constant = IWPhotoH;
         }else{
           self.pictureViewHConstraint.constant = IWPhotoH * 2 + 10;
         }
    }
    
    - (void)photoTap:(UITapGestureRecognizer *)recognizer
    {
         //确定photo的张数
         NSInteger count = self.pictures.count;
    
         // 1.封装图片数据
         NSMutableArray *myphotos = [NSMutableArray arrayWithCapacity:count];
         for (int i = 0; i<count; i++)
           {
              // 一个MJPhoto对应一张显示的图片
              MJPhoto *mjphoto = [[MJPhoto alloc] init];
              // 告诉URL,来源于哪个UIImageView(目的:点击这个图片变大之后,再点击要还原到那个位置)
              mjphoto.srcImageView = self.pictureView.subviews[i];
    
              mjphoto.url = [NSURL URLWithString:self.pictures[i]]; // 图片路径
    
              [myphotos addObject:mjphoto];
           }
    
         // 2.显示相册
         MJPhotoBrowser *browser = [[MJPhotoBrowser alloc] init];
         browser.currentPhotoIndex = recognizer.view.tag - 100; // 弹出相册时显示的第一张图片是?
         browser.photos = myphotos; // 设置所有的图片
         [browser show];
    }
    

    4.一种新的模型创建思维方式

    以前的话,只会定义需要的数据里面关键的字段,这次的开发,让我学到了需要定义整个服务器模型的方案,这里用一个例子来说明

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    @class PANewHomeData,PAManagerList,PABannerPicList,PANoticeList;
    @interface PANewHomeModel : NSObject
    @property (assign,nonatomic)NSInteger status;
    @property (copy,nonatomic)NSString *msg;
    /** 数据 */
    @property (strong,nonatomic) PANewHomeData *data;
    @end
    
    @interface PANewHomeData : NSObject
    /** 轮播图数组 */
    @property (strong,nonatomic) NSArray<PABannerPicList *> *bannerPicList;
    /** 社区活动图 */
    @property (copy,nonatomic) NSString *communityActivityPic;
    /** 小区ID(用户获取公告集合用) */
    @property (assign,nonatomic)NSInteger defaultVillageId;
    /** 小区名称 */
    @property (copy,nonatomic) NSString *defaultVillageName;
    /** 消息数量 */
    @property (assign,nonatomic)NSInteger informationNum;
    /** 我的管家数组 */
    @property (strong,nonatomic) NSArray<PAManagerList *> *myManagerList;
    /** 通知公告集合 */
    @property (strong,nonatomic) NSArray<PANoticeList *> *noticeList;
    /** 当前用户公告未读数量(用户标记公告的红色数量) */
    @property (assign,nonatomic)NSInteger noticeUnReadNum;
    /** 到家服务图 */
    @property (copy,nonatomic) NSString *servicePic;
    /** 到家服务地址 */
    @property (copy,nonatomic) NSString *serviceUrl;
    @end
    
    @interface PABannerPicList : NSObject
    /** 图片url */
    @property (copy,nonatomic) NSString *picUrl;
    /** 图片类型(用于跳转到详情用) */
    @property (copy,nonatomic) NSString *picType;
    /** 图片ID(用于跳转到详情用) */
    @property (copy,nonatomic) NSString *picId;
    @end
    
    @interface PAManagerList : NSObject
    /** 名称 */
    @property (copy,nonatomic) NSString *myManagerName;
    /** 电话 */
    @property (copy,nonatomic) NSString *myManagerPhone;
    @end
    
    @interface PANoticeList : NSObject
    /** 通知公告ID(点击滚动信息进入详情) */
    @property (assign,nonatomic) NSInteger noticeId;
    /** 通知公告标题 */
    @property (copy,nonatomic) NSString *noticeTitle;
    @end
    NS_ASSUME_NONNULL_END
    

    首页.h

    #import "PANewHomeModel.h"
    
    @implementation PANewHomeModel
    
    @end
    
    @implementation PANewHomeData
    + (NSDictionary *)objectClassInArray{
         return @{@"myManagerList" : [PAManagerList class],@"bannerPicList":[PABannerPicList class],@"noticeList":[PANoticeList class]};
    }
    @end
    
    @implementation PANoticeList
    
    @end
    
    @implementation PABannerPicList
    
    @end
    
    @implementation PAManagerList
    
    @end
    

    首页.m

    这里定义了每一个常量,字典单位不用进行转换,成为了下一个变量即可,如果是数组单位,需要在模型外包裹一个数组,也就是成为了泛型数组,这样子的方式,就让模型成为一级一级的台阶一样(这个objectClassInArray方法就取自MJExtension)

    然后在请求里这么包裹,如此就完成了,先导包:

    #import "NSObject+MJExtension.h"
    

    然后:

    -(id)getHomePageWithUserid:(NSInteger)userID CompletionHandle:(void (^)(id responseObj, NSError * error))completionHandle{
         NSMutableDictionary *mutDic = [[NSMutableDictionary alloc] init];
         mutDic[@"fUserId"] = @(userID);
         NSString *path = @"这里填写请求的地址";
    
         return  [ZRYYCacheClient POST:path parameters:mutDic cachePolicy:LYHTTPClientReloadIgnoringLocalCacheData success:^(NSURLSessionDataTask *task, id responseObject) {
              // 这里的parse方法,就是把responseObject转成PANewHomeModel这样子的模型方式,然后使用的时候,把responseObject前面的id变量,改成PANewHomeModel变量即可
              completionHandle([PANewHomeModel parse:responseObject], nil);
         } failure:^(NSURLSessionDataTask *task, NSError *error) {
              completionHandle(nil, error);
         }];
    }
    

    这样子肯定swift使用者认为肯定不安全了,至于swift能否这样子使用我不知道,我的脑洞是:可以用,但是在下面要进行guard let..else进行一次校验

    5.对缴费的认知

    因为对缴费的理解,支付宝是有两个密钥的(公钥和私钥),我以为是前端自己配置,但是后端考虑到不安全因素,是后端配置密钥,然后给一个接口我们调用,所以我的处理就非常单纯了,就是发送一个请求生成订单(也没有在info里配置URL Types)

    -(void)generateAliPayWuyeFeeWithBillMonths:(NSString *)billMonths Amount:(double)amount houseId:(NSInteger)houseID userId:(NSInteger)userId CompletionHandle:(void (^)(id, NSError *))completionHandle{
         NSString *path = @"支付链接";
    
         NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
         params[@"fUserId"] = @(userId);
         params[@"houseId"] = @(houseID);
         // 根据不同的订单类型,来决定支付哪个位置的订单
         params[@"bizType"] = @"1";
         params[@"billMonth"] = billMonths;
         params[@"amount"] = @(amount);
         [PAYYCacheClient POST:path parameters:params cachePolicy:LYHTTPClientReloadIgnoringLocalCacheData success:^(NSURLSessionDataTask *task, id responseObject) {
              ZRLog(@"请求的数据%@",responseObject);
              completionHandle([PAALiPayWYTCModel parse:responseObject],nil);
         } failure:^(NSURLSessionDataTask *task, NSError *error) {
              completionHandle(nil,error);
         }];
    }
    

    结果处理

    // 发支付宝消息 fromScheme:这里是urltype里设置好的schme
                        [[AlipaySDK defaultService]payOrder:responseObj.data.ordeInfo fromScheme:@"paproperty" callback:^(NSDictionary *resultDic) {
                             NSLog(@"reslut = %@",resultDic);
                        }];
    

    在appdelegate的处理

    #pragma mark -- 考虑这个app最低支持ios10,就设置这个即可
    /*
     * NOTE: 9.0以后使用新API接口
     **/
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
    {
         /**
          * resultStatus
          * 状态码
          * 9000 订单支付成功
          * 8000 正在处理中
          * 4000 订单支付失败
          * 6001 用户中途取消
          * 6002 网络连接出错
          */
         // 注意条件判断,不然会造成支付卡顿时间很长等情况
        if ([url.host isEqualToString:@"safepay"]) {
            // 支付跳转支付宝钱包进行支付,处理支付结果
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                ZRLog(@"result = %@",resultDic);
                 if ([resultDic[@"resultStatus"] integerValue] == 9000) {// 支付成功
    // 在物业费里注册了一个通知,进行回调
                      [[NSNotificationCenter defaultCenter]postNotificationName:PayWYSuccessKey object:resultDic];
    // 在停车费里注册了一个通知,进行回调
                     [[NSNotificationCenter defaultCenter]postNotificationName:PayTCSuccessKey object:resultDic];
                 }else{  // 支付失败了
                      [[NSNotificationCenter defaultCenter]postNotificationName:PayTCFailKey object:resultDic];
                 }
                //发出通知
                [[NSNotificationCenter defaultCenter] postNotificationName:kPayBack object:resultDic];
                [[NSNotificationCenter defaultCenter]postNotificationName:PayWYFailKey object:resultDic];
            }];
            
            // 授权跳转支付宝钱包进行支付,处理支付结果
            [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
                ZRLog(@"result = %@",resultDic);
                // 解析 auth code
                NSString *result = resultDic[@"result"];
                NSString *authCode = nil;
                if (result.length>0) {
                    NSArray *resultArr = [result componentsSeparatedByString:@"&"];
                    for (NSString *subResult in resultArr) {
                        if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
                            authCode = [subResult substringFromIndex:10];
                            break;
                        }
                    }
                }
                ZRLog(@"授权结果 authCode = %@", authCode?:@"");
            }];
        }
    }
    

    相关文章

      网友评论

          本文标题:一个项目的总结吧

          本文链接:https://www.haomeiwen.com/subject/ffkagqtx.html