昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下.

问题:

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==0)         return 40;   else  return 0.01;}-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{if (tableView.tag==0)          return 0;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:selfaction:@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(0, 0) 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.融云即时通讯,集成客服.

转载于:https://www.cnblogs.com/Cyan-zoey/p/5741893.html

iOS 之项目中遇到的问题总结相关推荐

  1. flutter不支持热更新_在iOS原生项目中使用Flutter,热更新

    前言: Flutter 因其自建的渲染引擎,背靠谷歌的支持,近来俘获了不少的开发小伙伴,越来越多的开发者尝试使用Flutter进行开发,在原生项目中嵌入Flutter来完成复杂度不高的页面成为了一个不 ...

  2. iOS开发——项目中的地图跳转(苹果地图,百度地图,高德地图)

    最近项目中遇到一个小需求,就是点击地图上的大头针进行导航,如果手机中装了多种地图软件,就用提示框显示出来,如果没有装地图软件,就默认跳转到苹果自带的地图进行导航,代码如下: //导航按钮 - (voi ...

  3. 初次使用Android Studio问题,Android Studio往项目中添加图片

    2019独角兽企业重金招聘Python工程师标准>>> 习惯了iOS往项目中直接拖拽的图片的习性,第一次往Android Studio中添加图片为难了,怎么也拖拽不进去,为难了,研究 ...

  4. (转)直接拿来用!最火的iOS开源项目(一)

    2019独角兽企业重金招聘Python工程师标准>>> 1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNet ...

  5. GitHub上最火的40个iOS开源项目(一)

    http://www.open-open.com/lib/view/open1388317004500.html 在结束了GitHub平台上"最受欢迎的Android开源项目"系列 ...

  6. GitHub上最火的40个iOS开源项目

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是G ...

  7. iOS大型项目解耦方案有难度?BeeHive设计优化来帮助

    [https://yq.aliyun.com/articles/71685?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ ...

  8. IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)

    IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...

  9. XamarinSQLite教程Xamarin.iOS项目中打开数据库文件

    XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...

  10. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件

    XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的"前 ...

最新文章

  1. C#中窗体的close,dispose,以及application.exit()的区别
  2. 拆解二战时期军用万用表,70多年前的万用表!
  3. Excel 工作表,单元格破解密码宏
  4. InstallShield For .Net制作.Net项目安装包之完整代码
  5. aidl远程服务调用Android,报错:Process 'command 'F:\Android\SDK\build-tools\29.0.0\aidl.exe''
  6. CSS之立方体绘画步骤
  7. 【无标题】简单的培根密码解密
  8. 巧用暴风影音快捷键 旋转视频画面
  9. Android 仿微博客户端 ViewPaper
  10. java创建无法确定大小的数组
  11. 超算优化重在存储,DAOS助力瑞金打造先进的生信大数据平台
  12. 【Godot 插件】获取编辑器上所有的节点
  13. ios虚拟服务器降级,升级了iOS 12很后悔,没关系手把手教你如何降级!
  14. CorelDRAW 入门知识
  15. 《曹云社》走进东软:奇妙的HR数字化
  16. 有天跟朋友一起聊天的感受
  17. 云栖大会:友盟+互联网企业数据中台,助力企业数智化转型
  18. android easyPR车牌识别
  19. 【UCIe】UCIe Clock Gating
  20. 亚马逊、Lazada、ebay、速卖通、shopee、敦煌、mercari、沃尔玛、测评(补单)自养号技术篇(论ip的重要性)

热门文章

  1. 阐述计算机在材料科学中的应用,计算机在材料科学中的应用例题
  2. php 创建 cookie文件,php创建、获取cookie及基础要点分析
  3. tar命令压缩和解压缩
  4. qt messagebox退出程序_Qt多线程创建
  5. async spring 默认线程池_springboot中@Async默认线程池导致OOM问题
  6. tomcat内存溢出解决方案_JVM了解以下?JVM系列~内存区域与内存溢出异常
  7. 【渝粤教育】国家开放大学2018年春季 0267-21T摄影技术 参考试题
  8. Django 上下文处理器
  9. docker-machine 下载iso慢的问题
  10. Uiautomator之入门