iOS 之项目中遇到的问题总结
昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下.
问题:
1.两表联动
所谓的两表联动就是有左右两个表格,左边的表格由二个分类构成,大分类用HeaderView 展示,小分类用cell 展示;右边的表格负责展示分类下的商品. 通过左边的分类点击展示对应右边表格的商品好处理,通过tableView的didSelectRowAtIndexPath 方法就能解决,可关键是滑动右边的表格要对应选中左边的分类,怎么处理???
还是tableView 的代理方法
- (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section {
if (_isRelate) {
NSInteger topCellSection = [[[tableView indexPathsForVisibleRows] firstObject] section]; //右边的section
}
}
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
if (_isRelate) {
NSInteger topCellSection = [[[tableView indexPathsForVisibleRows] firstObject] section]; //右边的section
if (tableView == _rightTableView) { //根据右边表格的section 查找左边对应的row 或section
}
}
}
#pragma mark - tableView 是继承scrollView 的
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
_isRelate = YES;
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
if (tableView.tag==) return ;
else return 0.01;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
if (tableView.tag==) return ;
else return 0.01;
}
注:右边滑动表格的 heightForHeaderInSection 以及 heightForFooterInSection 必须>0 使用才有效果
这是参考的gitHub 上的代码实现的,如需看源码,去gitHub搜索两表联动即可. 如果有更好的处理办法,欢迎补充!
2.关于UITabBar的隐藏
刚开始一直是使用 [self.tabBarController.tabBar setHidden:NO]; 对tabBar 进行隐藏的,这个代码在一般情况确实能实现隐藏的效果,但是什么情况下会有问题呢?
当控件(比如button)靠近屏幕底部的时候,无法触发事件,这个问题纠结了好久,也请教了许多前辈,后来我也上网差了些资料,终于,找到原因了. 就是tabBar 的隐藏问题导致的.虽然tabBar栏被隐藏了,但在隐藏的区域会成为一片空白区,无法被其他视图使用。这也就是为何button不响应时间的原因了.
解决办法:self.hidesBottomBarWhenPushed = YES; (但是要注意使用的时机,应该在视图push 前就设置隐藏,在pop 前设置为NO)
3.关于键盘遮挡输入框的问题
这个问题有两种情况,1种是输入框在self.view 上 另外一种是输入框在self.tableView 上.
如果是第一种情况,可以去看一下我第一篇博 http://www.cnblogs.com/Cyan-zoey/p/5133167.html
如果是第二种情况:
_oY=_rightTableView.frame.size.height;//记录初始化的时候tableView 的高度
//键盘出现的时候
- (void)keyboardWillShow:(NSNotification *)notification {
CGRect initialFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect convertedFrame = [self.view convertRect:initialFrame fromView:nil];
CGRect tvFrame = _rightTableView.frame;
tvFrame.size.height = convertedFrame.origin.y;
_rightTableView.frame = tvFrame;
}
//隐藏键盘
- (void)keyboardWillHide:(NSNotification *)notification {
CGRect tvFrame = _rightTableView.frame;
tvFrame.size.height =_oY;
_rightTableView.frame = tvFrame;
}
推荐使用第三方: IQKeyboardManager
4.手势冲突
a.UIWebView 嵌套UIScrollView
因为webView的内容是从网络加载的H5的页面,放入scrollView 里面造成手势冲突,从第一个页面滑动到webView所在页面的时候,就无法滑回去了,试了很多种办法都没解决. 后来去掉了UIScrollView. 如果有解决办法的,望赐教! (后来试了下webView中放其他的网页,发现并没有产生这个问题,所以可能是嵌入的网页做了什么处理,导致出现了这个情况)
b.tableview上添加点按手势与cell 点击事件冲突。
我在tableView 上添加了点按手势,在方法中删除了弹出层
[_tableView setUserInteractionEnabled:YES];
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tableTap)];
tap.delegate=self;
[_tableView addGestureRecognizer:tap];
#pragma mark ---点击tableView 中的空白部分删除弹出层
- (void)tableTap{
[_typeView removeFromSuperview];
_isEdit=NO; //在弹出层显示的时候设置为Yes ,消失的时候设置为NO
}
解决办法:实现手势的代理方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
// 输出点击的view的类名
//NSLog(@"%@", NSStringFromClass([touch.view class]));
if (_isEdit==YES) { //不拦截
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return YES;
}
}else{
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
}
// 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
return YES;
}
c.scrollView上添加手势不响应
http://blog.csdn.net/zouxianm/article/details/48194657
补充:事件冲突
self.view 上添加tableView ,在self.view 整体往上移动的时候,tableView 的行点击事件失效,任何手势都不响应。
解决办法:将tableView 添加到到window 上。
5.弹出层与删除层
5.1 弹出可移动的view(类似于windows上面可移动的弹框)
//先创建手势
UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self
action:@selector(doHandlePanAction:)];
[self.bigView addGestureRecognizer:panGestureRecognizer];
//拖动处理
- (void) doHandlePanAction:(UIPanGestureRecognizer *)paramSender{
CGPoint point = [paramSender translationInView:self.view];
NSLog(@"X:%f;Y:%f",point.x,point.y);
paramSender.view.center = CGPointMake(paramSender.view.center.x + point.x, paramSender.view.center.y + point.y);
[paramSender setTranslation:CGPointMake(, ) inView:self.view];
}
5.2 点击弹出层之外的地方,删除弹出层。
a. 弹出层加在self.view 上面
#pragma mark ---触摸事件---判断当前点是否在某个范围内
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
CGPoint t=[[touches anyObject] locationInView:self.bigView]; //bigView为弹出层
if (!CGRectContainsPoint(_bigView.frame, point)) //不在某个范围内
{
[self.bigView removeFromSuperview];//删除
}
}
b.弹出层加在AppDelegate的window上面。
//先注册点击手势
[_bigView setUserInteractionEnabled:YES];
UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(didmissTK:)];
[_bigView addGestureRecognizer:tap];
//实现方法
- (void)didmissTK:(UIGestureRecognizer *)gest{
CGPoint point = [gest locationInView:_bigView];
if (!CGRectContainsPoint(_bigView.frame, point, point)){
[self.bigView removeFromSuperview];
}
}
原因: 加在self.view 上面视图的不包括顶部的导航栏,要想包含导航栏就只能加在window 上面。 加在window上面就相当于在self.view 上覆盖了一层,因此 touchesBegan方法就无法响应,因此只能在window的弹出层上加手势去删除弹出层。
6.点击按钮不响应
a. 看一下该按钮是否是在UIImageView 上面,如果在,看一下是否把交互打开[_bigView setUserInteractionEnabled:YES];
b. 打印一下按钮的frame以及按钮父视图的frame,看一下按钮是否在父视图的范围内,如果不在,那么按钮不响应。在父视图的frame 内不响应,查看frame 是否不在屏幕内(self.view ),如果父视图的self.view.frame.original 为负,不响应事件。
c. 看一下按钮所在视图之上是否有覆盖层。如果有,移除覆盖层即可。
还有就是如果给按钮设置圆角或者边框颜色(与layer有关的)没有反应,记得设置 [btn.layer setMasksToBounds:YES];
7. Cell背景色覆盖按钮的颜色
cell默认选中行的颜色是灰色的,如果cell上有按钮等控件,会让自身的颜色被灰色覆盖
解决方法: 在自定义的cell中实现如下两个方法即可:
-(void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
被覆盖的控件名.backgroundColor = UIColor.redColor;
}
-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
[super setHighlighted:highlighted animated:animated];
被覆盖的控件名.backgroundColor = UIColor.redColor;
}
暂时只能想到这么多啦,再想到了新的会及时补充的.
现在来总结一下项目中使用到的SDK
1.腾讯地图SDK :进行地位,以及地图展示
2.SDWebImage:图片处理
实现过程:a: 如果设置了placeholderImage(占位图)就先展示占位图
b: SDImageCache 从内存中查找缓存的图片-》 找到了图片 , SDImageCacheDelegate 回调 到UIImageView+WebCache 等前端展示图片
-》 没找到图片 则去硬盘中查找-》找到了,SDImageCacheDelegate回调展示图片
-》没找到 ,使用SDWebImageManager下载图片
c:替换占位图
3.MJRefersh:上下拉刷新
4.MBProgressHUD:提示框
5.AFNetWorking: 网络请求
(1)组成:(封装自NSURLSession)
NSURLSession (AFURLSessionManager/AFHTTPSessionManager)----网络通信模块(核心模块)
Security(AFSecurityPolicy)----网络通讯安全策略模块
Reachability(AFNetworkReachabilityManager)----网络状态监听模块
Serialization(AFURLResponseSerializationAFURLRequestSerialization/)---网络通信信息序列化、反序列化模块
UIKit ----UIKit库
6.友盟应用统计错误分析
7.ping++:第三方支付
8.ZBarSDK:扫二维码/条形码 详细请见:http://www.cnblogs.com/Cyan-zoey/p/6121909.html
9.GtSdk :消息推送 详情请见:http://www.cnblogs.com/Cyan-zoey/archive/2016/04/28.html
10.融云即时通讯,集成客服.
iOS 之项目中遇到的问题总结的更多相关文章
- iOS原生项目中集成React Native
1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...
- iOS:项目中疑难Crash问题集锦
项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash ...
- ios在项目中打开word文档、ppt等总结
最近在项目开发中遇到下载附件文档预览需求,在这里总结一下我的实现方法,本文最后会附带我写的demo下载地址 这里我总结了三种实现方法(1)用webView预览(2)通过UIDocumentIntera ...
- iOS对项目中第三方类库的管理——CocoaPods
http://blog.csdn.net/lengshengren/article/details/1767 唐巧的博客:http://www.devtang.com/blog/2014/05/25/ ...
- 直接拿来用!最火的iOS开源项目
1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...
- (转)直接拿来用!最火的iOS开源项目(一)
1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...
- 【转】GitHub平台最火的iOS开源项目——2013-08-25 17
http://www.cnblogs.com/lhming/category/391396.html 今天,我们将介绍20个在GitHub上非常受开发者欢迎的iOS开源项目,你准备好了吗? 1. AF ...
- iOS开源项目
在结束了GitHub平台上“最受欢迎的Android开源项目”系列盘点之后,我们正式迎来了“GitHub上最受欢迎的iOS开源项目”系列盘点.今天,我们将介绍20个在GitHub上非常受开发者欢迎的i ...
- GitHub上最火的40个iOS开源项目
1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS. Mac OS X网络通信类库,现在是 ...
随机推荐
- C语言 · 奇偶判断
问题描述 能被2整除的数称为偶数,不能被2整除的数称为奇数.给一个整数x,判断x是奇数还是偶数. 输入格式 输入包括一个整数x,0<=x<=100000000. 输出格式 如果x是奇数,则 ...
- js实现前端分页页码管理
用JS实现前端分页页码管理,可以很美观的区分页码显示(这也是参考大多数网站的分页页码展示),能够有很好的用户体验,这也是有业务需要就写了一下,还是新手,经验不足,欢迎指出批评! 首先先看效果图: 这是 ...
- warensoft unity3d 更新说明
warensoft unity3d 组件的Alpha版本已经发布了将近一年,很多网友发送了改进的Email,感谢大家的支持. Warensoft Unity3D组件将继续更新,将改进的功能如下: 1. ...
- WPF样式之画刷结合样式
第一种画刷,渐变画刷GradientBrush (拿线性渐变画刷LinearGradientBrush(其实它涵盖在GradientBrush画刷内.现在拿他来说事.),还有一个圆心渐变画刷Radia ...
- bzoj3037--贪心
题目大意: applepi手里有一本书<创世纪>,里面记录了这样一个故事--上帝手中有着N 种被称作"世界元素"的东西,现在他要把它们中的一部分投放到一个新的空间中去以 ...
- 浅谈JSP中include指令与include动作标识的区别
JSP中主要包含三大指令,分别是page,include,taglib.本篇主要提及include指令. include指令使用格式:<%@ include file="文件的绝对路径 ...
- springmvc SSM shiro redis 后台框架 多数据源 代码生成器
A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址 ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...
- Android之SAX解析XML
一.SAX解析方法介绍 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备. SAX解析器是一种基于事件的解析器,事件驱动 ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 分享一个php的启动关闭脚本(原)
自己简单写的一个php服务的启动脚本和大家分享 思路(实现的原理): 1:function模块+case语句多分支判断 2:通过添加# chkconfig: 2345 43 89注释实现开机自启动(前 ...