【iOS】App仿写--天气预报
文章目录
- 前言
- 一、首页
- 二、搜索界面
- 三、添加界面
- 四、浏览界面
- 总结
前言
最近完成了暑假的最后一个任务——天气预报,特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页,搜索界面,添加界面,浏览界面,同时在天气预报中调用了较多的API,具体使用方法可以看这篇博客——【iOS】json数据解析以及简单的网络数据请求,这里不再说明
一、首页
对于首页,笔者将北京作为城市数组的第一个元素,后续可以通过搜索界面与添加界面对首页的城市进行添加

这里需要注意的是,因为我们的天气是实时变化的,所以我们只需要得到添加的城市名,然后通过城市名来得到实时的天气
另外需要注意的是因为我们的每个城市的天气的背景图片是不同的,然而我们自定义cell的在其出列时就已经被设置好,后面再去在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;方法中设置背景图片就会将自定义cell中原本自定义的控件覆盖掉。
所以需要如下代码设置我们的背景图片:
NSString *imageName = [NSString stringWithFormat:@"%ld.jpg", (indexPath.section + 1)];UIImage *image = [UIImage imageNamed:imageName];// 创建一个 UIImageView,并设置其内容为图片UIImageView *imageView = [[UIImageView alloc] initWithImage:image];imageView.frame = cell.contentView.bounds;imageView.contentMode = UIViewContentModeScaleAspectFill;imageView.clipsToBounds = YES;// 将 UIImageView 添加到 cell.contentView 的底部[cell.contentView insertSubview:imageView atIndex:0];
这样就做到了我们的背景图片不会覆盖我们cell中的控件,当然我们也可以在我们的对应的TableViewCell函数中设置我们的背景图片,只不过这样设置的背景图片比较单一,所以这里在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;方法中进行设置。
二、搜索界面
首先我们来看一下我们搜索界面的效果

可以看到我们的搜索结果会根据输入的文字进行实时变化
笔者这里使用的搜索栏是UISearchBar,我们在h文件中添加对应协议使用监听,即可实现我们的搜索的实时变化
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText; // called when text changes (including clear)
三、添加界面
我们先来看一下效果

可以看到我们这里利用搜索界面打开对应城市区县的天气之后点击添加按钮,相应的城市或区县就会被添加到首页,这里实际上使用了我们的通知传值,同样的,如果存在相同城市,那么就添加失败。具体有关通知传值的方法可以看这篇博客——【iOS】多界面传值

//添加界面
- (void)addCity {int boo = 0;for (id object in _hasCityArray) {//判断是否存在相同城市if ([object isEqualToString:_cityID]) {boo = 1;break;}}if (boo == 0) {//不存在[_dictionary setValue:_cityID forKey:@"key"];[[NSNotificationCenter defaultCenter] postNotificationName:@"notice" object:nil userInfo:_dictionary];NSLog(@"%@", _cityID);[self dismissViewControllerAnimated:YES completion:nil];} else {//存在self.alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"该城市已存在" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *confirmAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {}];[self.alert addAction:confirmAction];[self presentViewController:self.alert animated:YES completion:nil];}
}//首页界面
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotice:)
name:@"notice" object:nil];- (void)receiveNotice:(NSNotification *)send {[_cityIDArray addObject:send.userInfo[@"key"]];[self createData];
}
另外在这里笔者使用了SVGKit第三方库,因为在笔者调用的API中图标是以SVG的格式给出的,但是原生的Xcode并不支持SVG格式的图片,因此需要用到第三方库SVGKit,具体怎么使用第三方库在这篇博客【iOS】Cocoapods的安装以及使用中已经讲解过如何使用。
但是需要注意的一点是我们导入的SVGKit无法直接使用,会出现如下的问题 "Module 'CocoaLumberjack' not found" using CocoaPods,这是CocoaPods本身的问题,如何解决这个问题,笔者在这篇回答中找到了答案——Build problem “Module ‘CocoaLumberjack’ not found” using CocoaPods #543

笔者在这里给出部分API的调用代码供大家参考
- (void)creatUrl_Days {
// //1.创建请求地址NSString *urlString = [NSString stringWithFormat:@"https://devapi.qweather.com/v7/weather/7d?location=%@&key=4c75fbc6961d404289bf6b44d9009576", _cityID];//处理字符urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];//创建URLNSURL *url = [NSURL URLWithString:urlString];NSLog(@"%@", urlString);//2.创建请求类NSURLRequest *request = [NSURLRequest requestWithURL:url];//3.创建会话//delegateQueue 表示协议方法在哪个线程中执行// NSURLSession *session = [NSURLSession sharedSession];用于简单的网络请求NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];//4.根据会话创建任务NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {// 请求出错处理} else {NSDictionary *weatherData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];int count = 0;if (error) {// 解析数据出错处理} else {// 解析数据成功NSArray *dailyArray = weatherData[@"daily"];if (dailyArray.count > 0) {for (NSDictionary *currentDayData in dailyArray) {NSString *temperature_Low = currentDayData[@"tempMin"]; // 低NSString *temperature_High = currentDayData[@"tempMax"]; // 低NSString *temperature = [NSString stringWithFormat:@"%@°~%@°", temperature_Low, temperature_High];NSString *timeString = currentDayData[@"fxDate"]; // 时间NSLog(@"%@", timeString);NSString *time = [timeString substringWithRange:NSMakeRange(5, 5)];NSString *icon = currentDayData[@"iconDay"];// 将时间和温度分别添加到数组中[self.dayArray_Days addObject:time];[self.iconArray_Days addObject:icon];[self.temperatureArray_Days addObject:temperature];// NSLog(@"%@的温度为:%@, 图标代码为%@", time, temperature, icon);
// break;if (count == 0) {self->_highestT.text = [NSString stringWithFormat:@"最高%@°", temperature_High];self->_lowestT.text = [NSString stringWithFormat:@"最低%@°", temperature_Low];count++;self->_sunRise = currentDayData[@"sunrise"];self->_sunSet = currentDayData[@"sunset"];self->_precip = currentDayData[@"precip"];self->_uvIndex = currentDayData[@"uvIndex"];NSLog(@"%@, %@", self->_sunRise, currentDayData[@"sunrise"]);}}[[NSOperationQueue mainQueue] addOperationWithBlock:^{[self->_tableView2 reloadData];[self->_tableView3 reloadData];[self->_tableView4 reloadData];[self->_tableView5 reloadData];[self->_tableView6 reloadData];}];} else {NSLog(@"无法获取当前时间的天气数据。");}}}}];// 启动数据任务[dataTask resume];}
这里需要注意的是笔者这里将从API得到的数据存到对应的数组中, 然后在将数组中的元素呈现到我们的自定义cell上。
同时这里给出笔者调用的对应的API
每日天气预报
四、浏览界面

笔者这里将首页中的城市都传入了浏览界面,核心思路就是利用我们的UIScrollView,我们先前实现轮播图的思路是在UIScrollView中添加图片实现滚动,我们这里就将图片换成对应城市的视图控制器即可
//首页
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {ScrollViewController *t = [[ScrollViewController alloc] init];t.cityIDArray = _cityIDArray;t.nowPage = indexPath.section;t.modalPresentationStyle = 0;[self presentViewController:t animated:YES completion:nil];
}//ScrollViewController添加对应城市视图
for (int i = 0; i < _cityIDArray.count; i++) {CGFloat xOffset = i * self.view.bounds.size.width;MenuShowViewController *t = [[MenuShowViewController alloc] init];t.cityID = _cityIDArray[i];NSString *t1 = [NSString stringWithFormat:@"%d.jpg", (i + 1)];t.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:t1].CGImage);t.view.frame = CGRectMake(xOffset, 0, self.view.bounds.size.width, self.view.bounds.size.height);[self addChildViewController:t];[self.scrollView addSubview:t.view];[t didMoveToParentViewController:self];
}
同时笔者这里给出实现pageControl固定在视图底部的实现代码
self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height -
50, self.view.bounds.size.width, 50)];
self.pageControl.numberOfPages = _cityIDArray.count;
self.pageControl.currentPage = self.nowPage;
self.pageControl.pageIndicatorTintColor = [UIColor grayColor]; // 未选中页码的颜色
self.pageControl.currentPageIndicatorTintColor = [UIColor blackColor]; // 当前选中页码的颜色
[self.view addSubview:self.pageControl];
其实核心就是[self.view addSubview:self.pageControl];,无论我们的ScrollView如何滚动,我们的view是不变的,因此将pageControl添加到view中即可实现分页控件的固定
总结
暑假的App仿写已经全部写完,后面回去学习一些第三方库例如Masonry与AFNetworking
相关文章:
【iOS】App仿写--天气预报
文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报,特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页,搜索界面,添加界面,浏…...
快速远程桌面控制公司电脑远程办公
文章目录 第一步第二步第三步 远程办公的概念很早就被提出来,但似乎并没有多少项目普及落实到实际应用层面,至少在前几年,远程办公距离我们仍然很遥远。但2019年末突如其来的疫情,着实打了大家一个措手不及。尽管国内最初的大面积…...
亚信科技AntDB数据库专家出席数据库标准研讨会并参与研讨
2023年7月12日,全国信息技术标准化技术委员会数据库标准工作组(SAC/TC28/WG31)秘书处组织召开数据库标准研讨会,会议围绕数据库标准工作组2023年上半年开展的标准编制情况进行交流。亚信科技AntDB数据库相关专家出席会议ÿ…...
【我们一起60天准备考研算法面试(大全)-第三十四天 34/60】【前缀和】【北邮】
专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示&#…...
【数据分析】numpy (二)
numpy作为数据分析,深度学习常用的库,本篇博客我们来介绍numpy的一些进阶用法: 一,numpy的常用简单内置函数: 1.1求和: a np.array([[1, 2],[3, 4]]) np.sum(a)10 1.2求平均值: np.mean(a…...
Vue3小案例—v-model 双向数据绑定实现动态列表增加和删除
v-model双向绑定的原理: v-model 是Vue.js 提供的一个指令,用于实现双向数据绑定,它可以将表单元素的值与Vue实例的数据绑定在一起,当表单元素的值发生改变时,Vue实例的数据也会随之更新,反之亦然。 …...
MySQL 重置root 密码
5.7 版本 首先要把服务mysql57 关闭 net stop MySQL57 在安装的mysql57的程序的bin中 运行cmd(管理员运行) mysqld --defaults-file‘mysql存放数据的位置\my.ini’ --skip-grant-tables 上图 错误 注意:如果遇到mysqld: Can’t change dir…...
OpenCV图像处理技巧之空间滤波
1. 引言 再次问好,图像处理爱好者们!🌟 在前面的章节中,我们学习了图像处理的基础知识,并展现了图像增强的魅力。在这一节中,我们将更深入地研究空间滤波技术。 闲话少说,我们直接开始吧&#…...
Java超级玛丽小游戏制作过程讲解 第一天 创建窗口
package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…...
【POP3/IMAP/SMTP】QQ邮箱设置
什么是 POP3/IMAP/SMTP 服务 POP3 (Post Office Protocol - Version 3)协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。 IMAP (Internet Message Access Protocol)协议用于支持使用电子邮件客户端交互式存取服务…...
云计算——常见集群策略
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.什么是集群 二.集群策略 1.虚拟机HA 实现虚拟机高可用性通常涉及以下关键…...
c语言locale.h简介
<locale.h>提供的函数用于控制c标准库中对于不同的地区行为不一样的部分。(地区通常是国家或者某种特定语言的地理区域) 一、locale.h简单介绍 在标准库里,依赖地区的部分通常包括以下几项: 数字量的格式 货币的格式 字符…...
C++运算符重载详解(赋值、流插入流提取、前置后置++、取地址)
C运算符重载详解 基本介绍运算符重载案列1. 赋值运算符重载2. 前置和后置重载3. cout,cin(流插入,流提取重载)4. 取地址重载 基本介绍 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值…...
sql的count函数优化
sql的count(1)函数会执行遍历表统计符合条件的数目,下面有两个sql 第一条: select count(1) from membership_call_detail_statistics a where a.repository_id f2a4ed6b3e074e33bd99998c1def26f8 and a.statistics_date between 2023-04-01 00:00:0…...
Ai创作系统ChatGPT源码搭建教程+附源码
系统使用Nestjs和Vue3框架技术,持续集成AI能力到本系统! 更新内容: 同步官方图片重新生成指令 同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle) 同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x 新增GP…...
力扣 416. 分割等和子集
题目来源:https://leetcode.cn/problems/partition-equal-subset-sum/description/ C题解(思路来源代码随想录) : 背包问题有多种背包方式,常见的有:01背包、完全背包、多重背包、分组背包和混合背包等等。…...
sqlyog导出mysql数据字典
1.打开sqlyog执行sql获取字典数据 SELECTt.COLUMN_NAME AS 字段名,t.COLUMN_TYPE AS 数据类型,CASE IFNULL(t.COLUMN_DEFAULT,Null) WHEN THEN 空字符串 WHEN Null THEN NULL ELSE t.COLUMN_DEFAULT END AS 默认值,CASE t.IS_NULLABLE WHEN YES THEN 是 ELSE 否 END AS 是否…...
【C++】多态的实现及其底层原理
个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 文章目录 前言一、什么是多态?二、多态的构成条件2.1什么是虚函数?2.2虚函数的重写2…...
【网络编程】TCP带外数据总结
文章目录 一、带外数据基本知识二、带外数据的读写三、检测带外数据是否到达3.1、select上的异常事件3.2、SIGURG信号 四、带外标记 一、带外数据基本知识 带外数据(Out Of Band,OOB),用于迅速通告对方本端发生的重要事件…...
高薪程序员面试题精讲系列133之微服务里的网关有哪些实现方案?你熟悉Gateway网关吗?
一. 面试题及剖析 1. 今日面试题 微服务里的网关有哪些实现方案? Gateway网关是怎么实现的? 你用过Gateway网关吗? Gateway里有哪些路由规则? 2. 题目剖析 在上一篇文章中,壹哥给大家梳理了微服务里的远程调用、熔断等相关的面试题。今天这篇文章,壹哥会重点给大家梳理…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
