【iOS】——知乎日报第二周总结

news2024/12/28 4:53:20

文章目录

  • 一、自定义cell内容乱序问题
  • 二、WKWebView加载网页
  • 三、通过cell的协议函数进入指定网页
  • 四、滚动视图左滑加载新的网页
  • 五、隐藏导航栏


一、自定义cell内容乱序问题

当我下拉刷新的时候一开始我自定义的cell的内容顺序没有问题,当我一直下拉刷新或者上滑看以前的内容的时候就会出现乱序的情况,一开始以为是tableView的cell的复用问题,最后用了好久时间调试才发现我给cell赋值的数组有问题,我一开始数组的元素为每天的总的数据,后来改成了每天的分开的五个数据,最后解决了这个问题

 [[Manager sharedSingleton] PreNetWorkGetWithData:^(GetPreModel * _Nullable mainPreModel) {
        [self.zhihuModel.contentAllPreDataArray addObjectsFromArray:mainPreModel.stories];
        [self.contentAllDataArray addObjectsFromArray:mainPreModel.stories];
    } andError:^(NSError * _Nullable error) {
        //        NSLog(@"往日请求失败");
    } andURLStr:dateStr];

二、WKWebView加载网页

对于WKWebView我只是掌握了基本的初始化和创建等基本方法,关于一些进阶操作等后面有时间的再学,下面是我的一个测试demo的代码:

 WKWebView* webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.view = webView;
    NSURL *url = [NSURL URLWithString:@"https:\/\/daily.zhihu.com\/story\/9766643"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

运行结果如下;
请添加图片描述

三、通过cell的协议函数进入指定网页

这里我通过- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}方法,当点击cell时会响应该事件函数,在该事件函数中创建Web的视图控制器并通过属性传值将我网络请求的数据和当前cell的index值传到新创建的视图控制器,在新创建的web视图控制器,我将滚动视图的画布的大小设置成传入的数组的长度与当前屏宽的积,并且将滚动视图的起始坐标设置为index于屏宽的积,这样就是实现点击cell进指定网页

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    MainWebViewController* mainWebViewController = [[MainWebViewController alloc] init];
    if (indexPath.section == 1) {
        mainWebViewController.indexValue = indexPath.row;
        mainWebViewController.indexUrlStr = [self.contentDataArray[indexPath.row] url];
    } else if (indexPath.section > 1) {
        mainWebViewController.indexValue = (indexPath.section - 1) * 5 + indexPath.row;
        mainWebViewController.indexUrlStr = [self.zhihuModel.contentAllPreDataArray[(indexPath.section - 2) * 5 + indexPath.row] url];
    }

    
    //因为今日和昨日是调用两个网络请求,所以不知道哪个更快,这里进行一个判断,如果昨天的更快就将数据进行交换
    if (self.contentDataArray[0] != self.contentAllDataArray[0]) {
        for (int i = 0, j = 5; i < 5; i++, j++) {
            id tmp = 0;
            tmp = self.contentAllDataArray[i];
            self.contentAllDataArray[i] = self.contentAllDataArray[j];
            self.contentAllDataArray[j] = tmp;
        }
    }
    
    mainWebViewController.webAllDataArray = self.contentAllDataArray;
    NSLog(@" mainWebViewController.indexValue == %ld",  mainWebViewController.indexValue);
    mainWebViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    [self.navigationController pushViewController:mainWebViewController animated:YES];

}

四、滚动视图左滑加载新的网页

这里我一开始写的是- (void)scrollViewDidScroll:(UIScrollView *)scrollView方法,然后每次左滑后会让画布的大小增加五个屏宽并加载五个网页,但是运行的时候发现每次左滑都会让画布的大小增加远超过五个屏宽,后来查了一下发现这个方法只要当前坐标超过指定大小就会调用,所以我左滑时会多次调用,后来改成了- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate ,这个方法是当我结束左滑后会判断当前坐标与指定坐标的关系,所以最多只会调用一次

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSLog(@"进入这个函数");
    NSLog(@"目前坐标:%f", scrollView.contentOffset.x);
    NSLog(@"计算宽度:%f", self.webAllDataArray.count * WIDTH - WIDTH);
    if (scrollView.contentOffset.x >= (self.webAllDataArray.count * WIDTH - WIDTH)) {
        NSLog(@"进入");
        NSInteger dateCount = self.webAllDataArray.count;
        NSDate* urlDate = [[NSDate alloc] initWithTimeIntervalSinceNow:-(dateCount /5 + 1) * 3600 * 24];
        NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
        NSDateComponents* comp = [gregorian components:unitFlags fromDate:urlDate];
        NSString* dateStr = [NSString stringWithFormat:@"%ld%ld%ld",comp.year, comp.month, comp.day];
        
        [[Manager sharedSingleton] PreNetWorkGetWithData:^(GetPreModel * _Nullable mainPreModel) {
            //            self.contentPreDataArray = [NSArray arrayWithArray:mainPreModel.stories];
            
            [self.webAllDataArray addObjectsFromArray:mainPreModel.stories];
            NSLog(@"往日获取成功");
            dispatch_async(dispatch_get_main_queue(), ^{
                self.mainWebView.mainwebScrollView.contentSize = CGSizeMake(WIDTH * self.webAllDataArray.count, HEIGHT);
                for (int i = 0; i < 5; i++) {
                    self.mainWebView.mainwebView = [[WKWebView alloc] init];
                    self.mainWebView.mainwebView.frame = CGRectMake(WIDTH * (dateCount + i), 0, WIDTH, HEIGHT);
                    NSString* urlStr = [self.webAllDataArray[dateCount + i] url];
                    NSURL *url = [NSURL URLWithString:urlStr];
                    NSURLRequest *request = [NSURLRequest requestWithURL:url];
                    [self.mainWebView.mainwebView loadRequest:request];
                    [self.mainWebView.mainwebScrollView addSubview:self.mainWebView.mainwebView];
                }
                [self.mainWebView.mainwebScrollView setContentOffset:CGPointMake(WIDTH * (dateCount), 0) animated:NO];
            });
        } andError:^(NSError * _Nullable error) {
            //        NSLog(@"往日请求失败");
        } andURLStr:dateStr];
       
        }
}

五、隐藏导航栏

隐藏导航栏就是就是一个简单的方法,但是需要掌握隐藏导航栏的时机,我这里是当我的web视图控制器的视图将要出现是将导航栏隐藏,当视图将要消失的时候再让导航栏出现

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZYNQ连载01-ZYNQ介绍

ZYNQ连载01-ZYNQ介绍 1. ZYNQ 参考文档&#xff1a;《ug585-zynq-7000-trm.pdf》 ZYNQ分为PS和PL两大部分&#xff0c;PS即ARM&#xff0c;PL即FPGA&#xff0c;PL作为PS的外设。 2. 方案 ZYNQ7020为双核A9架构&#xff0c;多核处理器常用的运行模式为AMP(非对称多处理)和…

leetcode-链表

链表是一个用指针串联起来的线性结构&#xff0c;每个结点由数据域和指针域构成&#xff0c;指针域存放的是指向下一个节点的指针&#xff0c;最后一个节点指向NULL&#xff0c;第一个结点称为头节点head。 常见的链表有单链表、双向链表、循环链表。双向链表就是多了一个pre指…

Flume 快速入门【概述、安装、拦截器】

文章目录 什么是 Flume&#xff1f;Flume 组成Flume 安装Flume 配置任务文件应用示例启动 Flume 采集任务 Flume 拦截器编写 Flume 拦截器拦截器应用 什么是 Flume&#xff1f; Flume 是一个开源的数据采集工具&#xff0c;最初由 Apache 软件基金会开发和维护。它的主要目的是…

基于STM32景区人流检测控制系统设计

**单片机设计介绍&#xff0c;1651【毕设课设】基于STM32景区人流检测控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序程序文档 六、 文章目录 一 概要 基于STM32的景区人流检测控制系统设计是一种利用STM32微控制器开发的系统&#xff0c;用…

“赋能信创,物联未来” AntDB数据库携高可用解决方案亮相2023世界数字经济大会

10月14日&#xff0c;在2023世界数字经济大会暨京甬信创物联网产融对接会上&#xff0c;AntDB数据库技术总监北陌应邀发表《AntDB国产分布式数据库创新演进与高可用解决方案》主题演讲&#xff0c;就AntDB数据库助力客户数智化升级的高可用信创解决方案进行了详实、真挚地分享&…

前端实现埋点监控

前端实现埋点&监控 实现埋点功能的意义主要体现在以下几个方面&#xff1a; 数据采集&#xff1a;埋点是数据采集领域&#xff08;尤其是用户行为数据采集领域&#xff09;的术语&#xff0c;它针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。通过埋…

nginx 内存管理(二)

共享内存 共享内存结构与接口定义nginx共享内存在操作系统上的兼容性设计互斥锁锁的结构体锁的一系列操作&#xff08;core/ngx_shmtx.c&#xff09;创建锁 原子操作nginx的上锁操作尝试加锁获取锁释放锁强迫解锁唤醒等待进程 slab共享内存块管理nginx的slab大小规格内存池结构…

ctfshow-web入门命令执行29

29 源代码给了禁用flag 使用tac、nl ?cecho nl f*; ?cecho tac f*; 30 多禁用了system和php 和上题区别不大&#xff0c;使用上一题命令就能解 ?cecho nl f*; ?cecho tac f*; 31 禁用了空格使用%09代替 ?cecho%09tac%09f*; 32 禁用了echo 使用php伪协议 ?cinclud…

不做学习的奴隶,更要注重生活

下面是国外社交软件 i n s ins ins上近 40 40 40万点赞的帖子。 “睡8小时&#xff0c;而不是6小时。 锻炼1小时&#xff0c;而不是4小时。 学习3小时&#xff0c;而不是10小时。 读书2小时&#xff0c;而不是5小时。 深度工作3小时&#xff0c;而不是12小时。 你是人&#xff…

uniapp 模仿 Android的Menu菜单栏

下面这张图就是我们要模拟的菜单功能 一、模拟的逻辑 1. 我们使用uni-popup组件&#xff08;记得要用hbuilder X导入该组件&#xff09;uni-app官网 2. 将组件内的菜单自定义样式 二、uniapp代码 写法vue3 <template><view><uni-popup ref"showMenu"…

设计师在团队协作中的关键角色与策略

作为设计师&#xff0c;团队协作也是日常工作的一部分。在设计团队中&#xff0c;设计师如何参与团队协作&#xff1f;怎样才能更好的发挥自己的价值&#xff0c;顺利推进项目呢&#xff1f; 设计师遇到的协作难题&#xff1f; 首先我们看一下设计师在日常团队协作工作中可能…

C语言实现输入一个字符串,递归将其逆序输出

完整代码&#xff1a; // 输入一个字符串&#xff0c;递归将其逆序输出。如输入 LIGHT&#xff0c;则输出 THGIL #include<stdio.h> #include<stdlib.h> //字符串的最大长度 #define N 20//逆序输出字符串 void func(char *str){if (*str\0){//结尾时直接退出递归…

常见网络攻击及防御方法总结(XSS、SQL注入、CSRF攻击)

网络攻击无时无刻不存在&#xff0c;其中XSS攻击和SQL注入攻击是网站应用攻击的最主要的两种手段&#xff0c;全球大约70%的网站应用攻击都来自XSS攻击和SQL注入攻击。此外&#xff0c;常用的网站应用攻击还包括CSRF、Session劫持等。 1、 XSS攻击 XSS攻击即跨站点脚本攻击&am…

VBA宏查找替换目录下所有Word文档中指定字符串

原来搞质量管理&#xff0c;要替换质量文件里面所有特定名称或者某一错误时&#xff0c;需要逐一打开所有文件&#xff0c;非常麻烦&#xff0c;所以写了个VBA程序。过了这么多年&#xff0c;突然又要做同样的事情&#xff0c;发现新版本Word不支持其中的Application.FileSearc…

python自动化测试(五):按键模拟输入:全选、复制、清空、粘贴、完成

前置条件&#xff1a; 本地部署&#xff1a;ECShop的版本是3.0.0、Google版本是 Google Chrome65.0.3325.162 (正式版本) &#xff08;32 位&#xff09; Google驱动的selenium版本是3.11.0 目录 一、配置代码 二、键盘组合输入 2.1 全选&#xff1a;ctrl a 2.2 复制…

2023上半年系统集成项目管理工程师下午真题

文章目录 一&#xff1a;第5章 项目立项管理。第7章 项目范围管理&#xff0c;需求文件二&#xff1a;第9章 项目成本管理。第8章 项目进度管理&#xff0c;压缩工期三&#xff1a;第15章 信息&#xff08;文档&#xff09;和配置管理四&#xff1a;第18章 项目风险管理&#x…

ELASTICO-A Secure Sharding Protocol For Open Blockchains

INTRO 在中本聪共识中&#xff0c;通过POW机制来公平的选举leader&#xff0c;不仅非常消耗power&#xff0c;并且拓展性也不好。现在比特币中是7 TPS&#xff0c;和其他的支付系统相比效率相差甚远。 当前的许多拜占庭共识协议&#xff0c;并不支持在一个开放的环境中使用&a…

Linux 音频驱动实验

目录 音频接口简介为何需要音频编解码芯片&#xff1f;WM8960 简介I2S 总线接口I.MX6ULL SAI 简介 硬件原理图分析音频驱动使能修改设备树使能内核的WM8960 驱动alsa-lib 移植alsa-utils 移植 声卡设置与测试amixer 使用方法音乐播放测试MIC 录音测试LINE IN 录音测试 开机自动…

探索低代码PaaS平台的优势与选择原因

PaaS是一种云产品&#xff0c;它为应用程序的开发和部署提供基础结构。它提供中间件、开发工具和人工智能来创建功能强大的应用程序&#xff0c;大多数PaaS服务都与存储和网络基础架构捆绑在一起&#xff0c;就像基础架构即服务&#xff08;IaaS&#xff09;一样&#xff0c;可…

在Spring boot中 使用JWT和过滤器实现登录认证

在Spring boot中 使用JWT和过滤器实现登录认证 一、登录获得JWT 在navicat中运行如下sql,准备一张user表 -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id int(11) …