• 【iOS】知乎日报第三周总结


    上拉获取信息

    上拉tableView直至出现小菊花的加载动画,当请求完成时对cell数量自增,然后tableView reloadData

    请添加图片描述

    获取指定日期的前一天

    对于知乎日报,它每次获取数据时一次性获取当前最早日期的向前三天的数据,那么便每次让cell的section的数量+3,之后reloadData,只是这样的话,必须要先知道如何获取指定日期的前一天,然后再修改请求的URL,得到指定日期的数据字典。

    获取指定日期的前n天的日期

    //得到当天的前一天的日期
    - (NSDate*) getTimeBeforeWithDay: (NSInteger) day string:(NSString*) stringDate {
        NSDateFormatter* formatterTest = [[NSDateFormatter alloc]init];
        [formatterTest setDateFormat:@"YYYYMMdd"];
        
        NSDate* nowDate = [formatterTest dateFromString:stringDate];
        NSDate* theDate;
        
        if (day != 0) {
            NSTimeInterval oneDay = 24 * 60 * 60;
            
            theDate = [nowDate dateByAddingTimeInterval: - oneDay * day];
            
        } else {
            theDate = nowDate;
        }
        return theDate;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注意返回的类型是NSDate,传入的是NSString类型的日期例如“20221105”

    • 在tableView的父类scrollView的协议方法:

    – (void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

    内触发RefreshCell:

    //上拉获取更多cell
    - (void) RefreshCell:(NSNotification*) notification {
        
        // 网络请求
        
        NSDictionary* dict = notification.userInfo;
        
        NSLog(@"即将请求数据");
        //前缀
        NSString* stringTest = @"https://news-at.zhihu.com/api/4/news/before/";
        //可变的URL的字符串
        self.stringMutable = [[NSString alloc]initWithString:stringTest];
        //给字符串拼接日期字符串
        self.stringMutable = [self.stringMutable stringByAppendingString: dict[@"Date"]];
        //
        
        NSString* dateString = [NSString stringWithString:dict[@"Date"]];
        //循环三次网络请求然后添加cell,然后保留一个只含数字的日期字符串
        for (int i = 0; i < 3; i++) {
            [[Manage shareManage] NetWorkTestWithPreviousData:^(PreviousModel * _Nonnull mainViewModel) {
                
                
                
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self.mainView.allDictionaryArray addObject:[mainViewModel toDictionary]];
                    
                    self.mainView.cellCount += 1;
                    
                    [self.mainView.tableView reloadData];
                    
                    
                });
                
                NSLog(@"请求成功");
            } error:^(NSError * _Nonnull error) {
                NSLog(@"请求失败");
            } JSON:(NSString*) self.stringMutable];
            
            //然后让日期向前挪一天,加起来一共请求三天数据
            
            NSDate* date = [self getTimeBeforeWithDay:1 string:dateString];
            
            NSDateFormatter* myFormatter = [[NSDateFormatter alloc] init];
            //获取了前一天的的日期字符串
            [myFormatter setDateFormat:@"YYYYMMdd"];
            dateString = [myFormatter stringFromDate:date];
            
            //再把stringMuatble重新赋值
            self.stringMutable = [stringTest stringByAppendingString:dateString];
            
            //最后属性传值把MainView中的nowStringDate修改成一天前,下次申请从一天前的日期开始向前
            self.mainView.nowStringDate = dateString;
            
    
        }
    
        
        
       
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    这样就完成了刷新数据的需求。

    刷新时对请求得到的数据的处理

    每当调用刷新的方法时都把请求的字典存到MainView的数组属性中管理,这样就可以在reloadData时通过这个数组来重新布局

    目前获取数据仍存在bug,每次请求三天的数据都是随机排列的,请教学长后发觉可能是线程问题,下周解决

    WKWebView的使用

    UIScrollView* scrollView = [[UIScrollView alloc]init];
        
        scrollView.frame = CGRectMake(0, 40, Width, Height * 0.92 - 40);
        
        [self addSubview:scrollView];
        
        scrollView.contentSize = CGSizeMake(Width * 5, Height * 0.92 - 40);
        
        scrollView.pagingEnabled = YES;
        
        scrollView.showsHorizontalScrollIndicator = NO;
        scrollView.showsVerticalScrollIndicator = NO;
        
        
        
        
        for (int i = 0; i < 5; i++) {
            WKWebView* webView = [[WKWebView alloc]init];
            
            webView.frame = CGRectMake(Width * i, 0, Width, Height* 0.92 - 40);
            
            
            [scrollView addSubview:webView];
            //
            NSString* URLString = [NSString stringWithString:self.arrayURL[i]];
            
            NSURL* urlTest = [NSURL URLWithString:URLString];
            
            NSURLRequest* requestTest = [NSURLRequest requestWithURL:urlTest];
            
            [webView loadRequest:requestTest];
        }
        
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    使用WKWebView放到ScrollView上,可以左右滑动切换

    请添加图片描述

    WKWebView和UIWebView

    pushViewController

    每一个UIViewController的对象都有自带的属性NavigationController,但是直接使用又会因为NavigationController为空而不能push,需要在
    SceneDelegate.m的第一个方法里补充:

    	MainViewController* viewController = [[MainViewController alloc]init];
        
        UINavigationController* navigation = [[UINavigationController alloc]initWithRootViewController:viewController];
        
        self.window.rootViewController = navigation;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样的话我自定义的viewController就可以直接使用它自己的NavigationController来push、pop了

    请添加图片描述

    隐藏导航栏

    知乎日报的界面跳转动画是左右翻的,presentViewController这个方法是上下弹的,所以我们一般用pushViewConrtroller来写会简单一些,但是点击文章后进入的页面又没有导航栏,所以我们不需要导航栏出现,这时候:

    self.navigationController.navigationBarHidden = YES;
    
    • 1

    设置好一个navigationController的属性就可以不显示导航栏了

  • 相关阅读:
    codeforces:A. Writing Code【三维dp + 优化一维】
    《Effective STL》读书笔记(三):关联容器
    SpringBoot整合redis
    【PR】pr在导入rst字幕文件后,修改的样式无法显示在视频画面中
    stable-diffusion-webui相关资料汇总
    Springboot毕设项目基于web的校园互助系统设计 q2pf6java+VUE+Mybatis+Maven+Mysql+sprnig)
    【运维笔记】Docker 安装elasticsearch-7.4.0(在线Docker版)
    成都收录《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作
    SSM框架速成——mybatis速成总结
    【数据结构】C语言实现顺序栈 && OJ题 —— 有效的括号
  • 原文地址:https://blog.csdn.net/zdsey/article/details/127722737