• 知乎日报第四周总结


    一. 更新了具体消息界面无限右刷的方法

    原因是原方法下会有界面混乱的问题。

    原方法是我滑倒最后一页,在往后滑一定距离就会发送通知请求数据,并刷新页面。但是最近发现如果我只是往后滑一些,然后不停有把它滑会原最后一页。数据会继续请求并刷新,但是页面计算会出问题。因为我是把新数据第一页直接放在当前页面,所以新数据第一页会覆盖掉原数据最后一页。因为我是在数据请求前先添加6页,之后再根据数据更改,如果我一直向后滑甚至会出现数组越界问题。我又想不出办法监控它滑完后到底在哪一页,又应该能把新数据第一页覆盖到哪一页,所以就换了一个办法。

    新方法:

    1. 关闭滚动弹性。当用户滑倒最后一页时,先给scrollView在添加一页空白,让用户能向后滑,却只能滑倒这里,防止数组越界。如果用户滑倒这一页空白就发送通知,请求网络数据。

    1. - (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    2. if (self.scrollView.contentOffset.x == SCREEN_SIZE_WIDTH * self.numberOfStories) {
    3. [[NSNotificationCenter defaultCenter] postNotificationName:@"upDataRight" object:nil];
    4. return;
    5. }
    6. NSInteger number = self.scrollView.contentOffset.x / SCREEN_SIZE_WIDTH;
    7. [[NSNotificationCenter defaultCenter] postNotificationName:@"scrollViewDidEndDecelerating" object:nil userInfo:@{@"value":[NSNumber numberWithInteger:number]}];
    8. if (self.scrollView.contentOffset.x == SCREEN_SIZE_WIDTH * (self.numberOfStories - 1)) {
    9. self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width + SCREEN_SIZE_WIDTH, 0);
    10. }
    11. }

    2.  主界面控制器接收通知并请求数据。

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(upDataByStoriesUnlimitedRight) name:@"upDataRight" object:nil];
    1. - (void) upDataByStoriesUnlimitedRight {
    2. LastStoriesModel* lastStoriesModel = [self.lastStoriesModelArray lastObject];
    3. NSString* lastDate1 = lastStoriesModel.date;
    4. [self getLastStoriesWithDate:lastDate1];
    5. }

    3. 请求到数据后,更新主界面视图,并发送通知。

    1. - (void) getLastStoriesWithDate:(NSString*)lastDate {
    2. [self.manage getLastTime:lastDate StoriesData:^(LastStoriesModel * _Nonnull lastStoriesModel) {
    3. if (self.lastStoriesModelArray == nil) {
    4. self.lastStoriesModelArray = [[NSMutableArray alloc] init];
    5. }
    6. [self.lastStoriesModelArray addObject:lastStoriesModel];
    7. dispatch_async(dispatch_get_main_queue(), ^{
    8. [self sendStoriserToView:lastStoriesModel];
    9. [self.interFaceView viewInit];
    10. NSMutableArray* array = [[NSMutableArray alloc] init];
    11. for (Stories* stories in lastStoriesModel.stories) {
    12. [array addObject:stories.id];
    13. }
    14. [[NSNotificationCenter defaultCenter] postNotificationName:@"upDataRight-Two" object:nil userInfo:@{@"value":array}];
    15. });
    16. } error:^(NSError * _Nonnull error) {
    17. NSLog(@"getLastModel error");
    18. }];
    19. }

    4. 具体界面控制器接收通知并更新视图。

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(upDataToStoriesUnlimitedRight:) name:@"upDataRight-Two" object:nil];
    1. - (void) upDataToStoriesUnlimitedRight:(NSNotification*)notification {
    2. for (NSString* ID in notification.userInfo[@"value"]) {
    3. [self.storiesModel.storiesIDArray addObject:ID];
    4. }
    5. self.storiesInterFace.numberOfStories = [self.storiesModel.storiesIDArray count];
    6. self.storiesInterFace.nowStoriesNumber = self.storiesNumber;
    7. StoriesUnlimitedRightInterFace* interFaceView = (StoriesUnlimitedRightInterFace*)self.storiesInterFace;
    8. [interFaceView upDataRightWebView];
    9. }

    5. 视图层更新数据,给scrollView添加适合的页数。更新webView先计算到底在哪一页,发送更新那一页数据的通知。同时如果已经是最后一页,在后面添加空白页(防止这组数据只有一个,虽然不太可能)。

    1. - (void) upDataRightWebView {
    2. self.scrollView.contentSize = CGSizeMake(SCREEN_SIZE_WIDTH * self.numberOfStories, 0);
    3. NSInteger number = self.scrollView.contentOffset.x / SCREEN_SIZE_WIDTH;
    4. [[NSNotificationCenter defaultCenter] postNotificationName:@"scrollViewDidEndDecelerating" object:nil userInfo:@{@"value":[NSNumber numberWithInteger:number]}];
    5. if (self.scrollView.contentOffset.x == SCREEN_SIZE_WIDTH * (self.numberOfStories - 1)) {
    6. self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width + SCREEN_SIZE_WIDTH, 0);
    7. }
    8. }

    二. 解决了伪cell复用问题

    首先先说我解决cell复用问题,其实很简单,就是建立一个集合。给每一个展开按钮和被回复长评论label一个相关联的tag值。

    1. cell.unFoldButton.tag = (indexPath.section + 1) * 11111 + (indexPath.row + 1) * 11;
    2. cell.replyComment.tag = (indexPath.section + 1) * 22222 + (indexPath.row + 1) * 22;

    点击展开按钮后,将按钮的tag值存入集合,并按按钮的tag值得到label的tag值,进而得到label,改变label的状态使其展开。

    1. - (void)pressUnfold:(UIButton*)sender {
    2. if (!sender.tag) {
    3. return;
    4. }
    5. NSString* unfoldTagString = [NSString stringWithFormat:@"%ld", sender.tag];
    6. NSInteger replyCommentTag = sender.tag * 2;
    7. NSInteger unfoldLabelTag = sender.tag * 3;
    8. if ([self.unfoldSet containsObject:unfoldTagString]) {
    9. [self.unfoldSet removeObject:unfoldTagString];
    10. UILabel* label = (UILabel*)[sender.superview viewWithTag:replyCommentTag];
    11. label.numberOfLines = 2;
    12. [self.tableView reloadData];
    13. } else {
    14. [self.unfoldSet addObject:unfoldTagString];
    15. UILabel* label = (UILabel*)[sender.superview viewWithTag:replyCommentTag];
    16. label.numberOfLines = 0;
    17. [self.tableView reloadData];
    18. }
    19. }

    每次建立新cell都会使用这个集合判断其是否展开。

    1. if ([self.unfoldSet containsObject:[NSString stringWithFormat:@"%ld", cell.unFoldButton.tag]]) {
    2. cell.replyComment.numberOfLines = 0;
    3. } else {
    4. cell.replyComment.numberOfLines = 2;
    5. }

    但是这里我出现了一个伪复用问题,就是看起来很像复用问题,其实并不是,甚至不能算作问题,这只是一个特性。

    这个问题是,当页面中有很多展开按钮时,我按下其中一个只有它的标题会变成收起。此时我再次按下它时,它的标题会变成展开全文。但是会有另一个标题原本是展开全文的按钮,它的标题会突然变成收起,然后变回展开全文。我一开始以为它是复用问题,但我错了。

    我花了好久,一个断点一个断点的跑,确定我的设置标题的代码没有复用,才明白问题不在复用。这确实是复用造成的,但重点不在这里。

    其实是因为我偷懒,设置按钮状态没有使用它的selected属性,而是直接更改标题。但是Button的设置标题的属性是默认带有动画的,可能是为了视觉体验流畅。总之,我看到的,一个无相关的cell的按钮标题突然改变其实是因为复用cell之后,重新设置按钮标题时由“收到”慢慢变成“展开全文”的动画。

    解决方法也很暴力。我把这个按钮设成空白的,在它下面压了一个一摸一样大的label,然后通过改变label的text来改变按钮标题。

  • 相关阅读:
    一种基于交叉选择的柯西反向鲸鱼优化算法QOWOA附matlab代码
    如何使用 Javascript 将图标字体渲染为图片
    go 命令行工具 cobra
    How to solve matplotlib Chinese garbled characters in Ubuntu 22.04
    【源码】Vue.js 官方脚手架 create-vue 是怎么实现的?
    设计模式---原型模式
    java-php-python-婚纱影楼服务管理计算机毕业设计
    基于音频SOC开发板的主动降噪ANC算法源码实现
    系统架构设计:4 论微服务架构及其应用
    【机器学习7】优化算法
  • 原文地址:https://blog.csdn.net/m0_63852285/article/details/127838762