iOS开发——完整项目实战OC篇&百思不得姐第八天

百思不得姐第八天


上午


一:监听ScrollView停止两种方法

  • 代码实现滚动的时候:必须要有动画

  • 拖拽实现滚动的时候

二:ScrollView中,对应的X/Y宽高都相等的时候frmae就等一bounds

三:判断View是否在对应的View上面

1:判断父控件

2:看Window是否有值

3:是否创建加载

四:autormaticllyAdjustScrollViewInsets

五:内边距设置

1:tableView尺寸还是屏幕的尺寸(高度)

2:不被导航栏河tabBar挡住(用户能看齐所有内容)

3:能实现穿透效果


下午


六:实现步骤

---------------------------------------------------

1:发请求:获取服务器数据(导入AFNetWorking)

或者将返回的数据写成plist数据方便查看

 1     NSString *url = @"http://api.budejie.com/api/api_open.php";
 2
 3     NSMutableDictionary *dict = [NSMutableDictionary dictionary];
 4     dict[@"a"] = @"list";
 5     dict[@"c"] = @"data";
 6     dict[@"type"] = @1; //@"1";
 7
 8     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 9     self.manager = manager;
10
11     [_manager GET:url parameters:dict success:^void(NSURLSessionDataTask *data, id response) {
12         NSLog(@"%@", response);
13     } failure:^void(NSURLSessionDataTask *data, NSError *error) {
14
15     }];

这里我们需要创建网络请求的管理者

1 @property (nonatomic, strong) AFHTTPSessionManager *manager;
2
3 -(AFHTTPSessionManager *)manager
4 {
5     if (_manager == nil) {
6         _manager = [AFHTTPSessionManager manager];
7     }
8     return _manager;
9 }

返回数据,plist文件

---------------------------------------------------

2:根据返回的数据和文档的要求创建模型,新建对应需要的模型属性

 1 // 用户 -- 发帖者
 2 /** 用户的名字 */
 3 @property (nonatomic, copy) NSString *name;
 4 /** 用户的头像 */
 5 @property (nonatomic, copy) NSString *profile_image;
 6 /** 帖子的文字内容 */
 7 @property (nonatomic, copy) NSString *text;
 8 /** 帖子审核通过的时间 */
 9 @property (nonatomic, copy) NSString *created_at;
10 /** 顶数量 */
11 @property (nonatomic, assign) NSInteger ding;
12 /** 踩数量 */
13 @property (nonatomic, assign) NSInteger cai;
14 /** 转发\分享数量 */
15 @property (nonatomic, assign) NSInteger repost;
16 /** 评论数量 */
17 @property (nonatomic, assign) NSInteger comment;
18  

---------------------------------------------------

3:创建数组,将返回的数据使用字典转模型转成数组保存到创建的数组中(导入MJextention)

1 @property (nonatomic, strong) NSMutableArray *components;
2
3 -(NSMutableArray *)components
4 {
5     if (_components == nil) {
6         _components = [NSMutableArray array];
7     }
8     return _components;
9 }

再请求数据成功的block里面实现讲数据保存到数组

  • self.components = [iCocosComponentsModel objectArrayWithKeyValuesArray:response[@"list"]];

---------------------------------------------------

4:在cell中显示数据(count/cell)

 1 #pragma mark - Table view data source
 2
 3 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 4     return self.components.count;
 5 }
 6
 7 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 8 {
 9
10     static NSString *ID = @"iCocos";
11
12     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
13     if (cell == nil) {
14         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
15     }
16
17     iCocosComponentsModel *model = self.components[indexPath.row];
18
19     cell.textLabel.text = model.name;
20
21     return cell;
22
23 }

显示界面

---------------------------------------------------

5:添加系统自带的刷新控件

添加点击实现刷新数据

实现方法loadNewTopics并且在里面实现数据请求加载最新数据,然后再对应的时刻结束刷新endRefreshing

  • 注:刷新的时候,离开界面在点击回来会卡住

---------------------------------------------------

6:添加MJRefresh属性控件

使用:

下啦:加载最新的数据ID越来越大

上啦:加载旧的数据ID越来越小

属性

实现刷新数据

加载更多:取消之前的数据,直接加载所有最新的

上啦加载更多

原理

  • 原理1:

  • 原理2(推荐):

实现界面:

常见使用方法:

常见属性

基本使用:

 1 __weak __typeof(self) weakSelf = self;
 2
 3 /**
 4 * 上啦
 5 */
 6 self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
 7 // 进入刷新状态后会自动调用这个block
 8 // 隐藏时间
 9 [weakSelf loadNewData];
10 }];
11
12 // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
13 self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
14 // 马上进入刷新状态
15 [self.tableView.header beginRefreshing];
16
17
18
19 /**
20 * 下啦
21 */
22 self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
23 // 进入刷新状态后会自动调用这个block
24 // 隐藏时间
25 [weakSelf loadMoreData];
26 }];
27
28 // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
29 self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
30
31 // 马上进入刷新状态
32 [self.tableView.footer beginRefreshing];
33
34 - (void)loadNewData
35 {
36 // 1.添加假数据
37 for (int i = 0; i<5; i++) {
38 // [self.data insertObject:MJRandomData atIndex:0];
39 }
40
41 // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
42 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
43 // 刷新表格
44 [self.tableView reloadData];
45
46 // 拿到当前的下拉刷新控件,结束刷新状态
47 [self.tableView.header endRefreshing];
48 });
49 }
50
51 #pragma mark 上拉加载更多数据
52 - (void)loadMoreData
53 {
54 // 1.添加假数据
55 for (int i = 0; i<5; i++) {
56 // [self.data addObject:MJRandomData];
57 }
58
59 // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码)
60 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
61 // 刷新表格
62 [self.tableView reloadData];
63
64 // 拿到当前的上拉刷新控件,结束刷新状态
65 [self.tableView.footer endRefreshing];
66 });
67 }
68  

---------------------------------------------------

7:刷新数据bug

上啦和下啦同时进行

如果上啦先回来就回出现数据丢失

解决bug:控制器只人最后那个请求操作,其他的废弃



---------------------------------------------------

8:自定义Cell,使用Xib,实现Cell中对应的方法

注:因为我们使用的MVC模式作为项目的主设置模式,所以后面遇到数据处理,和数据显示第一想到的都应该是MVC

---------------------------------------------------

9:自动计算高度,适合于不同高度的Cell,

如果cell的高度不确定或者基本不一样,我们使用动态方式实现

拖线:

---------------------------------------------------

10:底部工具条的基本实现(数字拼接)

方法抽取

 1 /**
 2  * 设置工具条按钮的文字
 3  */
 4 - (void)setupButtonTitle:(UIButton *)button number:(NSInteger)number placeholder:(NSString *)placeholder
 5 {
 6     if (number >= 10000) {
 7         [button setTitle:[NSString stringWithFormat:@"%.1f万", number / 10000.0] forState:UIControlStateNormal];
 8     } else if (number > 0) {
 9         [button setTitle:[NSString stringWithFormat:@"%zd", number] forState:UIControlStateNormal];
10     } else {
11         [button setTitle:placeholder forState:UIControlStateNormal];
12     }
13 }

实现设置

1     // 设置底部工具条的数字
2     [self setupButtonTitle:self.dingButton number:topic.ding placeholder:@"顶"];
3     [self setupButtonTitle:self.caiButton number:topic.cai placeholder:@"踩"];
4     [self setupButtonTitle:self.repostButton number:topic.repost placeholder:@"分享"];
5     [self setupButtonTitle:self.commentButton number:topic.comment placeholder:@"评论"]; 

---------------------------------------------------

11:提示框的三种方式

1:UIAlertView

2:UIActionSheet

3:UIAlertController

*UIAlertView

*UIActionSheet

---------------------------------------------------

12:UITableView内部(Cell)调整

---------------------------------------------------

13:日期处理

基本格式:

获取时间间隔

日历类:(必须先转换成NSNdate)

服务器返回时间与处理:

基本使用

获取日期元素

 1 // 获取当前秒:基本手表时针旋转动画
 2 // 日历
 3 NSCalendar *calendar = [NSCalendar currentCalendar];
 4
 5 // 日期组件:秒,分,时,日,月,年
 6 // NSCalendarUnit:表示日期组件由哪些单元组成
 7 NSDateComponents *dateCmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
 8
 9 CGFloat sec = dateCmp.second;
10
11 // 获取分
12 CGFloat minute = dateCmp.minute;
13
14 // 获取小时
15 CGFloat hour = dateCmp.hour;
16
17 NSLog(@"%f %f",minute,hour);
18
19 根据时间旋转
20 // 计算秒针转多少度
21 CGFloat secA = angle2radion(perSecA * sec);
22
23 // 计算分针转多少度‘
24 CGFloat minA = angle2radion(perMinuteA * minute);
25
26 // 计算时针转多少度
27 CGFloat hourA = angle2radion(perHourA * hour + minute * perMinuteHourA);
28
29 // 秒针
30 _secLayer.transform = CATransform3DMakeRotation(secA, 0, 0, 1);
31
32 // 分针
33 _minuteLayer.transform = CATransform3DMakeRotation(minA, 0, 0, 1);
34
35 // 时针
36 _hourLayer.transform = CATransform3DMakeRotation(hourA, 0, 0, 1);
37
38
39  
时间: 2024-10-25 13:07:43

iOS开发——完整项目实战OC篇&百思不得姐第八天的相关文章

iOS开发——完整项目实战OC篇&amp;百思不得姐第四天

iOS开发——完整项目实战OC篇&百思不得姐第四天 上午 一:自定义按钮使用九宫格布局 二:控件不能点击 三:获取用户点击了那个按钮 四:调整按钮内部控件的位置:主流->上下 五:不能直接使用self.navigationController中或者View中获取导航控制器 方法一: 方法二: 六:布局取整 1 // 总行数 2 3 // NSUInteger rows = sqaures.count / maxCols; 4 5 // if (sqaures.count % maxCols)

iOS开发——完整项目实战OC篇&amp;百思不得姐第十一天

百思不得姐第十一天 一:模型中没有ID这个属性 为模型增加一个属性ID,设置名字替换 /** id */ @property (nonatomic, copy) NSString *ID; 替换: + (NSDictionary *)replacedKeyFromPropertyName {     return @{@"ID" : @"id"}; } 二:错误的将数组当作字典来用(其实就是没有数据,比如刷新数据已经没有了,或者直接就是0) 通过堆栈定位错误 最后一

iOS开发——完整项目实战OC篇&amp;百思不得姐第一天

百思不得姐第一天 做好准备,我们要开干了...... 先声明,我不过给出过多的代码实现,除非是一些重要的(开发中常用的),或者是比较难理解的. 主要介绍一些思路和简单功能的总结,还有一些遇到的错误及处理! 上午 一:修改项目名称(之前是Buble DisplayName) 二:删除(没有launchXIB的时候会显示界面错误),再iOS8以后屏幕的显示跟启动图片有关 需要删除对应,并且设置launchImages 或者我们可以自己在images.xcasesets中新建我们的launchImag

iOS开发——完整项目实战OC篇&amp;百思不得姐第五天

百思不得姐第五天 上午 一:蒙板 tabBarController:addsubViews Window:rootViewController Modal:presentViewController(rootViewController) 二:显示界面不是想要的效果 由于是使用Xib所以默认在ViewDidLoad中的frame是对应Xib的frame:(600,600) 我们如果要实现布局应该在-viewDidLayoutSubViews实现 但是如果真的要在ViewDidLoad里面实现我们

iOS开发——完整项目实战OC篇&amp;百思不得姐第三天

百思不得姐第三天 上午 错误:键盘处理 设置cell的分割线 方法一:添加一个View再上面 方法二:修改对应的Frame 拦截系统frame的设置,根据需求修改对应的值 不管别人传什么进来原值都不变,使用我们默认的值 优化 控制器挂掉取消 AFN内部实现 直接终止请求 暂停请求 取消请求总结 AFN返回码 debug不能全为小写 两者不同,下面的带IBOutlet的内部会隐士的强引用着他 所以调用方式是先打印后面的,就是说走完第一行之后并且没有销毁,等}走完之后就销毁 下午 设置圆形图片的简单

iOS开发——完整项目实战OC篇&amp;百思不得姐第二天

百思不得姐第二天 上午 一调用父类先后顺序问题 二:手势滑动 解决问题 1 // 什么时候调用:每次触发手势之前都会询问下代理,是否触发. 2 // 作用:拦截手势触发 3 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 4 { 5 // 注意:只有非根控制器才有滑动返回功能,根控制器没有. 6 // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器 7 if (s

iOS开发——完整项目实战OC篇&amp;百思不得姐第十天

百思不得姐第十天 一:设置时间的显示 显示如下 二:MJExtension类型(名字)的指定——映射 1.在模型实中 2.字典转模型中 三:常见问题 问题1:多个对一个 有时候可能会有多个属性对应一个名字的时候我们就需要使用的到数组 问题2:子模型中的名字 问题3:返回复杂的数据(比如在一个字典里面还有一个字典再在里面有一个url数组) 统一处理 四:模型中嵌套模型:数组中存放模型(模型里面有数组数组里面又装着模型) 或者在代理或在一个独立的文件中的load方法中 五:没有注释 没有参与编译 @

iOS开发——完整项目实战OC篇&amp;百思不得姐第六天

百思不得姐第六天 上午 一:使用Xib加载View 一般我们直接在分类里面,因为Xib加载的代码都是一样 二:键盘的两个常见属性 inoutAccessoryView inputView 三:切换系统和自定义键盘的简单使用方式,是不是很变态 根据使用的键盘判断类型并且切换 四:使用动画的方式,其实就是设置切换的时间就可以了 五:特殊需求,直接总定义并且添加View(不使用inoutAccessoryView) 使用通知实现工具条跟着键盘的移动:(上移键盘的高度) 1:改变Y值,上下改变Y值->使

iOS开发——完整项目实战OC篇&amp;百思不得姐第七天

百思不得姐第七天 上午 一:传值方式 谁传值(主动方):谁发通知. 谁传值(主动方):创建Blcok(判断). 谁传值(主动方):创建协议,代理方法. 详细请看: http://www.cnblogs.com/iCocos/p/4659878.html http://www.cnblogs.com/iCocos/p/4550169.html 二:按钮中的文字获取 方法一: 方法二: 将数组的所有path对应的属性取出来,放到一个数组厘面去 三:装逼试判断:三木运算 四:数组不能一边遍历一边删除