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文件损坏

    • 报错信息
      iOS 开发实训第十一周周报_第1张图片

    • 出现这个问题是因为我们的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 

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

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

      NSString *htmls = [NSString stringWithFormat:@" \n"
                                 " \n"
                                 " \n"
                                 " \n"
                                 ""
                                 "%@"
                                 ""
                                 "", htmlString];
      

三、参考链接

  • urlencode
    • https://www.jianshu.com/p/7ec6b0a47a4d
  • .xcodeproj文件损坏
    • https://www.jianshu.com/p/a0762b67e657
  • UILabel设置行距
    • https://www.jianshu.com/p/badee2350860
  • WKWebView修改html图片尺寸和字体大小
    • https://www.jianshu.com/p/252201b77ac3
    • https://www.cnblogs.com/wusang/p/9223688.html
    • https://segmentfault.com/q/1010000002693677
  • MJRefresh
    • https://www.cnblogs.com/xvewuzhijing/p/4904629.html
    • https://www.jianshu.com/p/df1f1f265c33
    • https://www.jianshu.com/p/e4ff42e6894c
    • https://www.cnblogs.com/xujiahui/p/6808018.html
  • 下滑列表自动加载
    • https://www.jianshu.com/p/55c0f5b5670f

你可能感兴趣的:(iOS)