首页 > 代码库 > iOS 之项目中遇到的问题总结
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
if (tableView == _rightTableView) { //根据右边表格的section 查找左边对应的row 或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.1;
}
注:右边滑动表格的 heightForHeaderInSection 以及 heightForFooterInSection 必须>0 使用才有效果
这是参考的gitHub 上的代码实现的,如需看源码,去gitHub搜索两表联动即可. 如果有更好的处理办法,欢迎补充!
2.关于UITabBar的隐藏
刚开始一直是使用 [self.tabBarController.tabBar setHidden:NO]; 对tabBar 进行隐藏的,这个代码在一般情况确实能实现隐藏的效果,但是什么情况下会有问题呢?
在我的订单里面有个cell,cell中有button,但是每次只要button靠近屏幕底部的时候,button都无法触发事件,这个问题纠结了好久,也请教了许多前辈,后来我也上网差了些资料,终于,找到原因了. 就是tabBar 的隐藏问题导致的.虽然tabBar栏被隐藏了,但在隐藏的区域会成为一片空白区,无法被其他视图使用。这也就是为何button不响应时间的原因了.
解决办法:self.hidesBottomBarWhenPushed = YES; (但是要注意使用的时机,应该在视图push 前就设置隐藏,在pop 前设置为NO)
3.关于键盘遮挡输入框的问题
这个问题有两种情况,1种是输入框在self.view 上 另外一种是输入框在self.tableView 上.
如果是第一种情况,可以去看一下我第一篇博
如果还第二种情况:
_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;
}
如果还有其他方法,欢迎补充!
4.手势冲突
a.UIWebView 嵌套UIScrollView
因为webView的内容是从网络加载的H5的页面,放入scrollView 里面造成手势冲突,从第一个页面滑动到webView所在页面的时候,就无法滑回去了,试了很多种办法都没解决. 后来去掉了UIScrollView. 如果有解决办法的,请赐教!
b. 我在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
}
导致tableView 的点击行事件无法响应
解决办法:实现手势的代理方法
- (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;
}
5.可移动的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(0, 0) inView:self.view];
}
6.点击按钮不响应
首先,你得看一下该按钮是否是在UIImageView 上面,然后再看一下是把交互打开[_bigView setUserInteractionEnabled:YES];
其次,打印一下按钮的frame以及按钮父视图的frame,看一下按钮是否在父视图的范围内,如果不在,那么按钮不响应。
还有就是如果给按钮设置圆角或者边框颜色(与layer有关的)没有反应,记得设置 [btn.layer setMasksToBounds:YES];
暂时只能想到这么多啦,再想到了新的会及时补充的.
现在来总结一下项目中使用到的SDK
1.腾讯地图SDK :进行地位,以及地图展示
2.SDWebImage:图片处理
3.MJRefersh:上下拉刷新
4.MBProgressHUD:提示框
5.AFNetWorking:网络请求
6.友盟应用统计错误分析
7.ping++:第三方支付
8.ZBarSDK:扫二维码/条形码
9.GtSdk :消息推送
10.融云即时通讯,集成客服.
iOS 之项目中遇到的问题总结