iOS 开发实训第十一周周报

一、学习笔记

  • urlencode

    • urlencode编码主要是用来解决url中出现中文或者特殊字符在网络传输过程中出现乱码的问题

    • 首先要定义要转义的字符集合,可以自定义也可以使用默认的,然后再调用stringByAddingPercentEncodingWithAllowedCharacters方法转义

      // 默认字符集
      NSCharacterSet *set= [NSCharacterSet URLUserAllowedCharacterSet];
      // 自定义字符集
      NSString *charaters = @"?!@#$^&%*+,:;='\"`<>()[]{}/\\| ";
      NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:charaters] invertedSet];
      
      NSString *encodedUrl = [url stringByAddingPercentEncodingWithAllowedCharacters:set];
      
  • UILabel设置行距和字间距

    • 需要使用富文本,通过修改富文本的属性实现

      // 富文本属性
      NSMutableDictionary *attrDict = [NSMutableDictionary dictionary];
      
      // 字体颜色
      attrDict[NSForegroundColorAttributeName] = [UIColor blackColor]; 
      // 字号大小
      attrDict[NSFontAttributeName] = [UIFont systemFontOfSize:16.0];
      
      // 段落样式
      NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
      paraStyle.lineSpacing = 10.0; // 行间距
      paraStyle.firstLineHeadIndent = 20.0; // 首行文本缩进
      attrDict[NSParagraphStyleAttributeName] = paraStyle; // 应用文本段落样式
      
      // 字间距(字符串)
      attrDict[NSKernAttributeName] = @(1);
      
      // 给Label设置富文本
      testLabel.attributedText = [[NSAttributedString alloc] initWithString:text attributes:attrDict];
      
  • 使用第三方库MJRefresh实现下拉刷新上拉加载

    • 只需要将UITableViewheaderfooter设置为MJRefresh里定义的类型,然后设置其回调函数即可

    • 实例:

      - (void)viewDidLoad {
          [super viewDidLoad];
          
          [self addSubViews];
      
        	// 集成下拉刷新控件
          [self setupDownRefresh];
          // 集成上拉刷新控件
          [self setupUpRefresh];
      }
      
      - (void)setupUpRefresh {
          self.newsTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
      }
      
      - (void)setupDownRefresh {
          self.newsTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
        	[self.newsTableView.mj_header beginRefreshing]; // 第一次加载
      }
      
      - (void)loadNewData {
          NSLog(@"loadNewData");
          FirstPageViewModel *viewModel = [[FirstPageViewModel alloc] init];
          [viewModel getFeedsListWithOffset:self.offset success:^(NSMutableArray * _Nonnull dataArray) {
              // 返回的数据插入在前面
              NSRange range = NSMakeRange(0, 20);
              NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:range];
              [self.tableDataArray insertObjects:dataArray atIndexes:indexSet]; 
              dispatch_async(dispatch_get_main_queue(), ^{
                  [self.newsTableView reloadData];
                  [self.newsTableView.mj_header endRefreshing];
                  self.offset = self.offset + 20;
                  NSLog(@"reload tableview");
              });
          } failure:^(NSError * _Nonnull error) {
              NSLog(@"请求失败 error:%@",error.description);
              [self.newsTableView.mj_header endRefreshing];
          }];
      }
      
      - (void)loadMoreData {
          NSLog(@"loadMoreData");
          FirstPageViewModel *viewModel = [[FirstPageViewModel alloc] init];
          [viewModel getFeedsListWithOffset:self.offset success:^(NSMutableArray * _Nonnull dataArray) {
            	// 返回的数据插入到后面
              [self.tableDataArray addObjectsFromArray:dataArray];
              dispatch_async(dispatch_get_main_queue(), ^{
                  [self.newsTableView reloadData];
                  [self.newsTableView.mj_footer endRefreshing];
                  self.offset = self.offset + 20;
                  NSLog(@"reload tableview");
              });
          } failure:^(NSError * _Nonnull error) {
              NSLog(@"请求失败 error:%@",error.description);
              [self.newsTableView.mj_footer endRefreshing];
          }];
      }
      
  • 自动加载:

    • 希望实现在上滑阅读的时候,显示到已加载的最后几条时就自动加载一次,实现较为平滑的效果

    • 我实现的方法是在UITableView的代理方法willDisplay中判断将要加载的Cell是否等于data.count - 5,等于的时候就主动调用一次加载数据的方法

      - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
          if (indexPath.row == self.tableDataArray.count - 5 && self.isLoading == NO) { // isLoading是为了避免和上拉加载下拉刷新冲突
              [self loadMoreData];
          }
      }
      

二、遇到的问题及解决方法

  • .xcodeproj文件损坏

    • 报错信息
      在这里插入图片描述

    • 出现这个问题是因为我们的github中没有加.gitignore文件,没有屏蔽.xcuserdata,当我从主分支拉代码到自己的分支后,和其他人的.xcodeproj文件冲突了,和其他部分的代码一样,会在冲突的地方加上<<<< HEAD ... ==== ... <<<<作为提示,导致.xcodeproj文件无法解析,所以打不开

    • 解决的方法就是用文本的格式打开.xcodeproj文件,然后解决冲突

  • WKWebView设置图片宽度适应屏幕

    • 网上绝大部分的解决方案都是在WKWebView的代理方法didFinishNavigation中调用JS代码来设置图片宽度,但是对我是无效的

      - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
             [ webView evaluateJavaScript:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '300%'" completionHandler:nil];
          [ webView evaluateJavaScript:@"var script = document.createElement('script');"
           "script.type = 'text/javascript';"
           "script.text = \"function ResizeImages() { "
           "var myimg,oldwidth;"
           "var maxwidth = 300.0;" // UIWebView中显示的图片宽度
           "for(i=1;i <document.images.length;i++){"
           "myimg = document.images[i];"
           "oldwidth = myimg.width;"
           "myimg.width = maxwidth;"
           "}"
           "}\";"
           "document.getElementsByTagName('head')[0].appendChild(script);ResizeImages();" completionHandler:nil];
      }
      

      运行时发现文字大小的设置是有效的,但是对图片的设置没用,也在一个问答网站里看到有人遇到了同样的问题,在下面的回答里有一种说法是需要再次加载才可以控制图片,但是没有解释清楚

    • 另一种解决方法为将原始的htmlString进行封装,将JS代码加到htmlString里,就不需要调用WKWebView的代理方法,这个方法对我是有效的

      NSString *htmls = [NSString stringWithFormat:@"<html> \n"
                                 "<head> \n"
                                 "<style type=\"text/css\"> \n"
                                 "body {font-size:15px;}\n"
                                 "</style> \n"
                                 "</head> \n"
                                 "<body>"
                                 "<script type='text/javascript'>"
                                 "window.onload = function(){\n"
                                 "var $img = document.getElementsByTagName('img');\n"
                                 "for(var p in  $img){\n"
                                    " $img[p].style.width = '100%%';\n"
                                     "$img[p].style.height ='auto'\n"
                                 "}\n"
                                 "}"
                                 "</script>%@"
                                 "</body>"
                                 "</html>", htmlString];
      

三、参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值