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

文章目录

  • 一、自定义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];
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode-链表

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

ITSource 分享 第5期【校园信息墙系统】

项目介绍 本期给大家介绍一个 校园信息墙 系统&#xff0c;可以发布信息&#xff0c;表白墙&#xff0c;分享墙&#xff0c;校园二手买卖&#xff0c;咨询分享等墙信息。整个项目还是比较系统的&#xff0c;分为服务端&#xff0c;管理后台&#xff0c;用户Web端&#xff0c;小…

ELASTICO-A Secure Sharding Protocol For Open Blockchains

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

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

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

Java SE 学习笔记(十七)—— 单元测试、反射

目录 1 单元测试1.1 单元测试概述1.2 单元测试快速入门1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 获取类对象2.3 获取构造器对象2.4 获取成员变量对象2.5 获取常用方法对象2.6 反射的作用2.6.1 绕过编译阶段为集合添加数据2.6.2 通用框架的底层原理 1 单元测试 1.1 单元测试概…

基于单片机的太阳跟踪系统的设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、硬件电路设计2.1跟踪控制方案的选择2.1.1跟踪系统坐标系的选择2.2系统总体设计及相关硬件介绍…

服务熔断保护实践--Hystrix

概述 微服务有很多互相调用的服务&#xff0c;构成一系列的调用链路&#xff0c;如果调用链路中某个服务失效或者网络堵塞等问题&#xff0c;而有较多请求都需要调用有问题的服务时&#xff0c;这是就会造成多个服务的大面积失效&#xff0c;造成服务“雪崩”效应。 服务“雪…

十九、类型信息(2)

本章概要 Class 对象 类字面常量泛化的 Class 引用cast() 方法 Class 对象 要理解 RTTI 在 Java 中的工作原理&#xff0c;首先必须知道类型信息在运行时是如何表示的。这项工作是由称为 **Class**对象 的特殊对象完成的&#xff0c;它包含了与类有关的信息。实际上&#x…

JVM第二十三讲:Java动态调试技术原理

Java动态调试技术原理 本文是JVM第二十三讲&#xff0c;Java动态调试技术原理。转载自 美团技术团队胡健的Java 动态调试技术原理及实践&#xff0c;通过学习java agent方式进行动态调试&#xff0c;了解目前很多大厂开源的一些基于此的调试工具 (例如来自阿里开源的Arthas)。 …

微信小程序设计之主体文件app-wxss/less

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…

elementUI 特定分辨率(如1920*1080)下el-row未超出一行却换行

在1920*1080分辨率下&#xff0c; el-col 内容未超出 el-col 宽度&#xff0c;el-col 不足以占据一行&#xff0c;el-row 却自动换行了&#xff08;其他分辨率没有这个问题&#xff09;。 截图&#xff1a; 排查&#xff1a; el-col 内容没有溢出&#xff1b;没有多余的 pad…

拜耳阵列(Bayer Pattern)和解马赛克简介

拜尔阵列 典型的图像传感器&#xff08;例如我们在数码相机中使用的图像传感器&#xff0c;主要有CCD, CMOS&#xff09;由许多单独的光电传感器组成&#xff0c;所有这些传感器都会捕获光线。这些光电传感器本身能够捕获光的强度&#xff0c;但不能捕获其波长&#xff08;颜色…

CTF-Web(3)文件上传漏洞

笔记目录 CTF-Web(2)SQL注入CTF-Web(3)文件上传漏洞 1.WebShell介绍 (1)一句话木马定义 一种网页后门&#xff0c;以asp、php、jsp等网页文件形式存在的一种命令执行环境&#xff0c;而 一句话木马往往只有一行WebShell代码。 作用&#xff1a; 攻击获得网站控制权限 查看、修改…

如何防范AI等技术带来的诈骗风险?从技术、法律、教育等多方面入手

文章目录 前言什么是AI诈骗案例案例一案例二 AI诈骗的特点如何预防和应对AI诈骗建议后记 前言 互联网是一把双刃剑&#xff0c;这是我们常说的一个问题。 随着人工智能技术的快速发展&#xff0c;AI诈骗成为当今社会面临的新兴威胁。不法分子利用人工智能技术&#xff0c;以更…

Qt之实现支持多选的QCombobox

一.效果 1.点击下拉列表的复选框区域 2.点击下拉列表的非复选框区域 二.实现 QHCustomComboBox.h #ifndef QHCUSTOMCOMBOBOX_H #define QHCUSTOMCOMBOBOX_H#include <QLineEdit> #include <QListWidget> #include <QCheckBox> #include <QComboBox>…

面试算法43:在完全二叉树中添加节点

题目 在完全二叉树中&#xff0c;除最后一层之外其他层的节点都是满的&#xff08;第n层有2n-1个节点&#xff09;。最后一层的节点可能不满&#xff0c;该层所有的节点尽可能向左边靠拢。例如&#xff0c;图7.3中的4棵二叉树均为完全二叉树。实现数据结构CBTInserter有如下3种…

Vue 3 响应式对象:ref 和 reactive 的使用和区别

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

Flink CDC 2.0 主要是借鉴 DBLog 算法

DBLog 算法原理 DBLog 这个算法的原理分成两个部分&#xff0c;第一部分是分 chunk&#xff0c;第二部分是读 chunk。分 chunk 就是把一张表分为多个 chunk&#xff08;桶/片&#xff09;。我可以把这些 chunk 分发给不同的并发的 task 去做。例如&#xff1a;有 reader1 和 re…

二叉树的最近公共祖先

题目&#xff1a; 样例&#xff1a; 输入 6 1 4 2 5 -1 -1 1 4 -1 -1 -1 -1 -1 3 输出 2 思路&#xff1a; 由题意&#xff0c;最近公共祖先就是&#xff0c;找出给出的两个结点的父结点 是谁。 这里有两种情况 1、给定的两个结点都是孩子结点 2、给定的两个结点&#xff…

【送书福利-第二十二期】《Vue.js 3企业级项目开发实战(微课视频版)》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…