【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;
}

注意返回的类型是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;
        

    }

    
    
   
}

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

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

每当调用刷新的方法时都把请求的字典存到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];
    }
    
    

使用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;

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

请添加图片描述

隐藏导航栏

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

self.navigationController.navigationBarHidden = YES;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值