上拉获取信息
上拉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上,可以左右滑动切换
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的属性就可以不显示导航栏了