知乎日报第四周总结

news/2024/7/20 21:12:27 标签: ios

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

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

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

新方法:

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

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

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

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

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

- (void) getLastStoriesWithDate:(NSString*)lastDate {
    [self.manage getLastTime:lastDate StoriesData:^(LastStoriesModel * _Nonnull lastStoriesModel) {
        if (self.lastStoriesModelArray == nil) {
            self.lastStoriesModelArray = [[NSMutableArray alloc] init];
        }
        [self.lastStoriesModelArray addObject:lastStoriesModel];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            [self sendStoriserToView:lastStoriesModel];
            [self.interFaceView viewInit];
            
            NSMutableArray* array = [[NSMutableArray alloc] init];
            for (Stories* stories in lastStoriesModel.stories) {
                [array addObject:stories.id];
            }
            [[NSNotificationCenter defaultCenter] postNotificationName:@"upDataRight-Two" object:nil userInfo:@{@"value":array}];
        });
    } error:^(NSError * _Nonnull error) {
        NSLog(@"getLastModel error");
    }];
}

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

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

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

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

二. 解决了伪cell复用问题

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

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

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

- (void)pressUnfold:(UIButton*)sender {
    if (!sender.tag) {
        return;
    }
    NSString* unfoldTagString = [NSString stringWithFormat:@"%ld", sender.tag];
    NSInteger replyCommentTag = sender.tag * 2;
    NSInteger unfoldLabelTag = sender.tag * 3;
    
    
    if ([self.unfoldSet containsObject:unfoldTagString]) {
        
        [self.unfoldSet removeObject:unfoldTagString];

        UILabel* label = (UILabel*)[sender.superview viewWithTag:replyCommentTag];
        label.numberOfLines = 2;

        [self.tableView reloadData];
    } else {
        
        [self.unfoldSet addObject:unfoldTagString];

        UILabel* label = (UILabel*)[sender.superview viewWithTag:replyCommentTag];
        label.numberOfLines = 0;

        [self.tableView reloadData];
    }
}

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

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

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

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

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

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

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


http://www.niftyadmin.cn/n/5676.html

相关文章

Mysql数据库整体设计

一、Mysql整体架构 二、Parser解析器 注意:mysql8.0没有查询缓存了。 步骤说明: 1、客户端发送一条sql语句 2、mysql会检查sql语句,查看是否命中缓存,如果命中缓存,直接返回结果,不继续执行。没有命中则进…

如何快速选购腾讯云NVIDIA GPU云服务器实例?

GPU 云服务器(Cloud GPU Service)是基于 GPU 的快速、稳定、弹性的计算服务,主要应用于深度学习训练/推理、图形图像处理以及科学计算等场景。 GPU 云服务器提供和标准 CVM 云服务器一致的方便快捷的管理方式。GPU 云服务器通过其强大的快速处…

前言【高等数学教程1(单变量微积分)】

前言【高等数学教程1(单变量微积分)】 1. 什么是高等数学? 目前大部分高等院校教授的高等数学(advanced mathematics)课程内容主要是微积分(calculus)。 1.1 微积分的发明 微积分有两位主要的发明人,牛顿和莱布尼茨。 牛顿除了…

从0实现线性回归

编码题: 按要求完成下面的内容 1请用python完成从0实现线性回归,尝试使用不同的训练参数(学习率,迭代次数), 以及不同的评价方法(MSE,MAE,RMSE,R2)等。 2比较说明sklearn的线性模…

Java -- 每日一问:Java常见的垃圾收集器有哪些?

典型回答 实际上,垃圾收集器(GC,Garbage Collector)是和具体 JVM 实现紧密相关的,不同厂商(IBM、Oracle),不同版本的 JVM,提供的选择也不同。接下来,我来谈谈…

【面经】之小鼠喝药问题

题目 现在有 10 只小白鼠和 1000 支药水,1000 支药水中有且仅有一支药水有毒,如果小白鼠喝下毒药,那么毒发的时间是两小时。 现在只给你两小时的时间,请问如何用这 10 只小白鼠测出哪支药水有毒?(忽略小白…

java计算机毕业设计网络精品课程网站(附源码、数据库)

java计算机毕业设计网络精品课程网站(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…

Python避坑指南

Python是一门清晰易读的语言,Guido van Rossum在设计Python时希望将其设计为一种没有任何歧义和意外行为的语言。但不幸的是,依然存在某些极端情况Python的行为跟你的预期不同。这些情况往往容易被忽视,理所当然的认为Python会按预期执行&…