文章目录

  • 天气app总结
    • 改了一下整体的项目框架
    • 第三方框架
      • BMKLocationKit百度定位API
      • Masonry布局API
      • YYModel初始化model
    • 沙盒系统filemanager&filehandle操作文件流
    • widget小部件
      • **创建方法**⬇️
      • 共享数据
      • 点击widget跳转到app
    • MVC
    • property
    • tableviewcell的复用
    • 代理实现页面反向传值
      • 正向传值
      • 反向dismiss传值

天气app总结

改了一下整体的项目框架



主要由三个页面以及一个widget组成

第三方框架

BMKLocationKit百度定位API

官方文档

Masonry布局API

需要先添加控件到视图,再执行类似这种代码。

[self.jumpToChoseCityViewBtn mas_makeConstraints:^(MASConstraintMaker *make) {make.size.mas_equalTo(CGSizeMake(25, 25));make.centerY.equalTo(self).multipliedBy(1.2);make.right.mas_equalTo(-20);
}];

YYModel初始化model


用于json数据的解析,自动转化为model,当然你要构建好你的model,然后调用

YYWeatherDataModel *model = [YYWeatherDataModel yy_modelWithDictionary:dataDic];

如果由嵌套model的话,需要这样构建model⬇️

//.h文件
#import <Foundation/Foundation.h>
#import <YYModel/YYModel.h>
#import "YYWeatherArrModel.h"
#import "YYRealTimeDataModel.h"NS_ASSUME_NONNULL_BEGIN@interface YYWeatherDataModel : NSObject//该model是array类型的需要这样创建
@property (nonatomic, strong) NSArray <YYWeatherArrModel *> *weather;@property (nonatomic, strong) YYRealTimeDataModel *realtime;@endNS_ASSUME_NONNULL_END
//.m文件
#import "YYWeatherDataModel.h"@implementation YYWeatherDataModel+ (NSDictionary *)modelContainerPropertyGenericClass {return @{@"weather" : [YYWeatherArrModel class],@"realtime" : [YYRealTimeDataModel class]};
}@end

沙盒系统filemanager&filehandle操作文件流

包括沙盒lib地址、在该地址下创建新文件夹地址、其中文件(本地自定义数据储存位置)地址、数据转换data转array等

@property (nonatomic, strong) NSString *libPath;
@property (nonatomic, strong) NSString *dataPath;
@property (nonatomic, strong) NSString *cityDataPath;
@property (nonatomic, strong) NSFileManager *fileManager;
@property (nonatomic, strong) NSFileHandle *fileHandle;
@property (nonatomic, strong) NSData* data;
@property (nonatomic, strong) NSString *dataStr;
@property (nonatomic, strong) NSArray *array;

寻找沙盒lib地址之后确定新建文件夹以及文件地址

self.libPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) lastObject];
self.dataPath = [self.libPath stringByAppendingPathComponent:@"CityData"];
self.cityDataPath = [self.dataPath stringByAppendingPathComponent:@"cityData"];

初始化filemanager&filehandle

self.fileManager = [NSFileManager defaultManager];//用来判断文件夹或文件是否创建成功
self.fileHandle = [NSFileHandle fileHandleForReadingAtPath:self.cityDataPath];//文件流操作

创建文件

- (void)createFile{if (![self.fileManager fileExistsAtPath:self.dataPath]) {NSError *creatError;[self.fileManager createDirectoryAtPath:self.dataPath withIntermediateDirectories:YES attributes:nil error:&creatError];}if (![self.fileManager fileExistsAtPath:self.cityDataPath]) {//创建文件[self.fileManager createFileAtPath:self.cityDataPath contents:nil attributes:nil];}
}

初始化数据,读取文件数据,并转化为数组

- (void)initData{self.data = [[NSData alloc] init];
}- (void)getData{self.data = [self.fileHandle readDataToEndOfFile];self.dataStr = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];//去掉结尾/nself.dataStr = [self.dataStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];self.array = [self.dataStr componentsSeparatedByString:@","];
}

widget小部件

小部件是一个和app独立开的个体,虽然两个工程在同一个project里,但是其沙盒是不同的,也就是不能互相访问数据和代码。

创建方法⬇️


共享数据

为了数据共享我们需要创建一个App Groups,在这里添加并创建,两个target都要设置好哦!

共享数据⬇️

//发送共享数据
NSUserDefaults *shareWeatherData = [[NSUserDefaults alloc] initWithSuiteName:@"group.******"];NSDictionary *shareDataDic = @{@"cityName":self.locWeather.cityName};[shareWeatherData setObject:shareDataDic forKey:@"DataDic"];[shareWeatherData synchronize];

widget里直接接收即可⬇️

NSUserDefaults *shareWeatherData = [[NSUserDefaults alloc] initWithSuiteName:@"group.******"];self.todayModel = [TodayModel alloc];NSDictionary *dataDic = [shareWeatherData objectForKey:@"DataDic"];self.todayModel.todayCityName = [dataDic objectForKey:@"cityName"];

点击widget跳转到app

给viewcontroller添加点击手势事件

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(jumpToApp)];[self.view addGestureRecognizer:tapGesture];

调用

- (void)jumpToApp{NSURL *url = [NSURL URLWithString:@"NewWeatherWidget://"];[self.extensionContext openURL:url completionHandler:^(BOOL success) {if (success) {NSLog(@"打开成功");}}];
}

MVC

个人理解:
model是需要的数据的模型
view里只是setUpUI,layout的自定义,显示数据
viewcontroller里是负责把数据放到model里,把model给view,再将view addSubview到主页面上显示出来

property

如NSArray,NSDictionary等不想要被更改的数据需要深拷贝,关键词用copy;而NSMultableArray等可变数组或字典,需要动态去更新里面的数据的对象需要使用strong,不然在进增删改等操作时会出现unrecognized selector sent to instance等错误。
在动态数组中,需要增加或者更新数据时可以这样做⬇️
利用中间商完成操作

 self.locoalCityName = locCityName;NSMutableArray *newArray = [self.allCityArr mutableCopy];[newArray replaceObjectAtIndex:0 withObject:locCityName];self.allCityArr = newArray;

tableviewcell的复用

个人理解最好就是将所有cell里的要用的数据在外面封装好,处理好,然后简单的传入cell,在cell里去操作,实现赋值等。
例如⬇️
这里dataSource数组里装的是许多个天气信息,封装好,传进去。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {HomeCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"pageCell" forIndexPath:indexPath];MyWeather *weather = self.dataSource[indexPath.row];cell.homePageView.weather = weather;return cell;
}

在cell里面实现赋值并刷新页面,因为我是collectionview里面嵌套了tableview所以是这样的。

- (void)setWeather:(MyWeather *)weather {if (_weather != weather) {_weather = weather;self.headerView.weather = weather;[self.tableView reloadData];}else{[self.tableView reloadData];}
}

代理实现页面反向传值

正向传值

正向跳转页面传值可以直接传,即⬇️
创建下一个页面,然后直接给该页面的对象传递值,然后跳转即可。

-(IBAction)choseCityBtnClick:(id)sender{ChoseCityViewController *choseCityViewController = [[ChoseCityViewController alloc] init];choseCityViewController.modalPresentationStyle = UIModalPresentationFullScreen;choseCityViewController.city = self.city;choseCityViewController.dataSource = self.dataSource;choseCityViewController.delegate = self;[self presentViewController:choseCityViewController animated:YES completion:nil];
}

反向dismiss传值

利用代理
A present-> B,B dimiss-> A
在B中声明一个代理协议和方法

@protocol ChoseCityViewDelegate <NSObject>- (void)currentPageFromChoseCityView:(NSInteger)page;@end

然后在B接口里添加B的代理对象

@interface ChoseCityViewController : UIViewController@property (nonatomic, weak) id <ChoseCityViewDelegate> delegate;@end

然后在b.m中实现dismiss,并判断如果A中实现了该代理方法就传值过去,并调用A中方法

[self dismissViewControllerAnimated:YES completion:^{if ([self.delegate respondsToSelector:@selector(currentPageFromChoseCityView:)]) {[self.delegate currentPageFromChoseCityView:3];}}];

在A.h中继承B的代理

@interface ViewController : UIViewController<ChoseCityViewDelegate>

在A.m中实现代理方法

- (void)currentPageFromChoseCityView:(NSInteger)page{self.buttomView.pageControl.currentPage = page;[self.buttomView.pageControl updateCurrentPageDisplay];
}

iOS仿苹果原生天气app总结相关推荐

  1. ios 仿苹果闹钟_苹果片状iOS闹钟的三种选择

    ios 仿苹果闹钟 If two iPhone alarm failures in less than three months (the Daylight Savings bug and the N ...

  2. android 仿苹果 小组件,安卓玩烂的小组件 iOS怎么又给捡起来了?

    在所有用户的认知中,新系统区别于旧系统的第一印象永远是外观上的变化,例如iOS7的扁平化设计.iOS 10的控制中心.iOS 13的深色模式. 而在即将推出的iOS 14中,最直观的变化莫过于重新设计 ...

  3. 苹果天气不显示_热门天气APP被苹果拿下,安卓用户不能再使用

    近日,Android平台最受欢迎的订阅式天气APP之一Dark Sky官方宣布其被苹果收购.收购后,Android和Wear OS上的Dark Sky APP都会在2020年7月1日下架,届时将关闭服 ...

  4. 【苹果家庭推iiMessage】React Native举行开发仍是iOS,用原生的代码实现类似webview的页面

    推荐内容IMESSGAE相关 作者推荐内容 iMessage苹果推软件 *** 点击即可查看作者要求内容信息 作者推荐内容 1.家庭推内容 *** 点击即可查看作者要求内容信息 作者推荐内容 2.相册 ...

  5. 仿ios相机apk_icamera相机下载-icamera仿苹果软件v4.0_5577安卓网

    icamera仿苹果相机安卓下载推荐给大家!这是一款可以媲美苹果原生相机的手机软件,在拍摄手法和照片处理上还有着自己独特的见识,摄像功能也是相当强大,icamera相机还提供了专属滤镜,欢迎前来体验! ...

  6. 来自法国的山寨苹果系统——梨子系统PearOS,精美仿苹果风格的免费Linux操作系统(颇有iOS和OSX的神...

    我们都知道苹果 OS X 和 iOS 操作系统的设计都非常讨好人,但基本上只能购买 MacBook 或 iPhone.iPad 等设备才能体验它们.不过,今天被我发现了一款可以在PC上安装的精美仿苹果 ...

  7. 基于Swift的简易iOS天气APP

    文章目录 1. 项目简介 1.1 功能与参数 1.2 效果图 2. 运行方法 3. 相关资源 3.1 API参考文档 3.2 天气图标 4. 项目源码 1. 项目简介 这是一款用Swift 5编写的简 ...

  8. iOS系统什么天气app可以访问锁屏?

    正常情况下,iOS的界面上显示的是时间和日期,并没有显示天气.我一般会在负一屏中添加墨迹天气,来实现天气预报的功能.那么,是不是在手机就不能实现锁屏天气呢? 如果想手机的主屏实现天气App,那么我们需 ...

  9. 苹果ios签名过期了,APP应用还能照常使用吗?

    对于苹果签名,相信很多小伙伴们都不是很了解,尤其是刚刚接触的,他们在和小编的聊天过程中,都会向小编咨询同一个问题,如果苹果ios签名到期了,app应用还能继续使用吗?对于这个问题我们要具体问题具体分析 ...

  10. 仿ios相机apk_仿苹果相机下载

    极相机火爆来袭,快来18183下载吧! 极相机性能极佳, 反应奇快,拍摄照片和录制视频的速度比系统相机还快.极相机支持实时滤镜,可以在捕捉美景前预览照片.还支持手势操作,左右滑动即可快速在视频和拍照之 ...

最新文章

  1. python代码判断指定日期是当前年的第多少天
  2. python dict 字典 清空
  3. SpringCloud中Feign服务调用请求方式及参数总结
  4. 使用OpenGL实现翻书动画
  5. Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析
  6. 今天用python的turtle简单画了一副眼镜
  7. 遍历children_589. N叉树的前序遍历
  8. 工程之道,解读业界最佳的深度学习推理性能优化方案
  9. Maxwell与Canal 工具对比
  10. LeetCode 59. Spiral Matrix II
  11. 全新的Kafka controller
  12. JavaScript 上传文件并展示
  13. EI/scopus推荐-智能交通与智慧城市会议
  14. oracle10g_database安装教程,Oracle Database 10g数据库安装及配置教程
  15. 《穿透:像社会学家一样思考》简述
  16. 更改设置并对计算机自定义,电脑别乱玩 禁用Win8.1自定义设置项
  17. 大数据的学习总结(2)--大数据基础知识
  18. 【Java基础】(八)方法(即C等语言中的函数)
  19. CC2640R2F BLE5.0 蓝牙协议栈Off-Chip OAD功能
  20. RZ7886/7888/7889/7899/TA6586小功率直流电机正反转驱动芯片简介

热门文章

  1. Latex --- 加三级子标题,解决没有编号问题(已解决)(加头文件即可)
  2. [原创] IE中的图片显示不出来
  3. Linked Data_百度百科
  4. 计算机网络中WLAN是指,什么是WLAN网络 WLAN是什么意思
  5. python中array是什么意思_python array是什么
  6. 花3150本钱拉一车菠萝,在马路边摆摊卖水果,卖7天收入4170
  7. Meltdown漏洞分析
  8. bigbluebutton视频直播服务器调用接口
  9. echarts图例动态置灰
  10. 飞火流星测试经验总结