iOS开发中遇到的那些坑.docx
- 文档编号:10949017
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:20
- 大小:521.38KB
iOS开发中遇到的那些坑.docx
《iOS开发中遇到的那些坑.docx》由会员分享,可在线阅读,更多相关《iOS开发中遇到的那些坑.docx(20页珍藏版)》请在冰豆网上搜索。
iOS开发中遇到的那些坑
iOS开发中遇到的那些坑
从事iOS开发有些年月了,从最开始的磕磕绊绊,不知所措,到现在的遇到困难都能快速做出最佳方案处理,中间经历了不可或缺的痛苦。
在项目开发中,本人有用印象笔记记录的习惯,所以很多重复出现的坑,很快迎刃而解,而不在同一个地方摔倒两次。
为此,特意总结了一下开发中经常遇到的坑,有些可能和你形成共鸣,有些在你看来或许是小儿科,不喜勿喷。
[objc]viewplaincopy
Avalidprovisioningprofileforthisexecutablewasnotfound.
解决问题所在:
发布证书无法运行在真机上!
!
!
XCode8的项目在xcode7运行报错:
[objc]viewplaincopy
Thedocument“ViewController.xib”requiresXcode8.0orlater.ThisversiondoesnotsupportdocumentssavedintheXcode8format.OpenthisdocumentwithXcode8.0orlater.
有两种方法解决这个问题:
1.你同事也升级Xcode8,比较推荐这种方式,应该迎接改变。
2.右击XIB或SB文件->Openas->SourceCode,删除xml文件中下面一行字段。
场景:
tabbar左右pan手势切换,其中一个VC是UIPageViewController,这样会导致到pageView的时候不能切换tabbar,如何禁掉pageVC切换呢?
出于UIPageViewController和UItableView等产生手势冲突,我们往往要禁用其翻页手势,代码如下:
self.pageViewController.dataSource=nil;
网络上搜到的重写手势等方法,亲测无效,所以给出这个最简单粗暴的方法。
[objc]viewplaincopy
//tabbar的切换动画(一般不用哦)
-(void)viewWillDisappear:
(BOOL)animated
{
[superviewWillDisappear:
animated];
CATransition*transition=[CATransitionanimation];
[transitionsetDuration:
1];
[transitionsetType:
@"fade"];
[self.tabBarController.view.layeraddAnimation:
transitionforKey:
nil];
}
[objc]viewplaincopy
//解决带有轮播图的手势冲突
-(BOOL)gestureRecognizer:
(UIGestureRecognizer*)gestureRecognizershouldReceiveTouch:
(UITouch*)touch
{
if(touch.view.frame.origin.y<100){
returnNO;
}
returnYES;
}
[objc]viewplaincopy
//1,禁止.DS_store生成:
打开“终端”,复制黏贴下面的命令,回车执行,重启Mac即可生效。
defaultswritecom.apple.desktopservicesDSDontWriteNetworkStores-boolTRUE
//2,恢复.DS_store生成:
defaultsdeletecom.apple.desktopservicesDSDontWriteNetworkStores
FMDB根据条件查询数据库出现的错误:
问题:
注意选项A...我竟然匹配不到这种字符,\r\n\t都不行
方案:
中文全角空格...你想说什么...我转了下...\u3000已解决!
[objc]viewplaincopy
//Objective-C拓展了C,自然很多用法是和C一致的。
比如浮点数转化成整数,就有以下四种情况。
//1.简单粗暴,直接转化
floatf=1.5;inta;a=(int)f;NSLog("a=%d",a);
//输出结果是1。
(int)是强制类型转化,丢弃浮点数的小数部分。
//2.高斯函数,向下取整
floatf=1.6;inta;a=floor(f);NSLog("a=%d",a);
//输出结果是1。
floor()方法是向下取整,类似于数学中的高斯函数[].取得不大于浮点数的最大整数,对于正数来说是舍弃浮点数部分,对于复数来说,舍弃浮点数部分后再减1.
//3.ceil函数,向上取整。
floatf=1.5;inta;a=ceil(f);NSLog("a=%d",a);
//输出结果是2。
ceil()方法是向上取整,取得不小于浮点数的最小整数,对于正数来说是舍弃浮点数部分并加1,对于复数来说就是舍弃浮点数部分.
//4.通过强制类型转换四舍五入。
floatf=1.5;inta;a=(int)(f+0.5);NSLog("a=%d",a);
关于block传值及数据同步总结:
ABC三个界面间C界面修改内容达到AB界面刷新最新的数据保持ABC数据同步:
1.C到B可以用block回调传值2.B界面到A界面只需在B界面Back的时候发出拉取数据并刷新cell即可解决数据不同步现象。
[objc]viewplaincopy
//在iOS开发过程中,我们可能会碰到一些系统方法弃用,weak、循环引用、不能执行之类的警告。
有代码洁癖的孩子们很想消除他们,今天就让我们来一次Fuck警告!
!
//首先学会基本的语句
#pragmaclangdiagnosticpush
#pragmaclangdiagnosticignored"-Wdeprecated-declarations"
//这里写出现警告的代码
#pragmaclangdiagnosticpop//这样就消除了方法弃用的警告!
iOS8调用相机警告:
错误代码:
Snapshottingaviewthathasnotbeenrenderedresultsinanemptysnapshot.Ensureyourviewhasbeenrenderedatleastoncebeforesnapshottingor
snapshotafterscreenupdates.
IOS8多了一个样式UIModalPresentationOverCurrentContext,
IOS8中presentViewController时请将控制器的modalPresentationStyle设置为UIModalPresentationOverCurrentContext,问题解决!
!
错误点:
ENABLE_BITCODE错误设置(mrc下)
解决方法:
[objc]viewplaincopy
//默认选中第一行
[tableViewselectRowAtIndexPath:
[NSIndexPathindexPathForRow:
0inSection:
0]animated:
NOscrollPosition:
UITableViewScrollPositionNone];
//实现了选中第一行的方法
[selftableView:
_mainIndustryTableViewdidSelectRowAtIndexPath:
[NSIndexPathindexPathForItem:
0inSection:
0]];
例如:
//默认下选中状态
-(void)customAtIndex:
(UITableView*)tableView
{
//默认选中第一行
[tableViewselectRowAtIndexPath:
[NSIndexPathindexPathForRow:
0inSection:
0]animated:
NOscrollPosition:
UITableViewScrollPositionNone];
if([tableViewisEqual:
_mainIndustryTableView]){
[selftableView:
tableViewdidSelectRowAtIndexPath:
[NSIndexPathindexPathForItem:
0inSection:
0]];
}
}
iOSheaderview与tableview之间距离控制?
[objc]viewplaincopy
//view作为tableView的tableHeaderView,单纯的改变view的frame是无济于事的,tableView不会大度到时刻适应它的高度(以后Apple会不会改变就不知道了),
//所以,如何告诉tableView它的tableHeaderView已经改变了?
很简单,就一句话(关键最后一句):
[webViewsizeToFit];
CGRectnewFrame=headerView.frame;
newFrame.size.height=newFrame.size.height+webView.frame.size.height;
headerView.frame=newFrame;
[self.tableViewsetTableHeaderView:
headerView];
//这样以后,效果就出来了。
不过这种过度显得有些生硬,能不能加一点点动画,让它变得顺眼一些呢?
试试下面的代码:
[self.tableViewbeginUpdates];
[self.tableViewsetTableHeaderView:
headerView];
[self.tableViewendUpdates];
Cell分割线不全:
[objc]viewplaincopy
-(void)viewDidLayoutSubviews{
if([_listTableViewrespondsToSelector:
@selector(setSeparatorInset:
)]){
[_listTableViewsetSeparatorInset:
UIEdgeInsetsZero];
}
if([_listTableViewrespondsToSelector:
@selector(setLayoutMargins:
)]){
[_listTableViewsetLayoutMargins:
UIEdgeInsetsZero];
}
}
-(void)tableView:
(UITableView*)tableViewwillDisplayCell:
(UITableViewCell*)cellforRowAtIndexPath:
(NSIndexPath*)indexPat{
if([cellrespondsToSelector:
@selector(setLayoutMargins:
)]){
[cellsetLayoutMargins:
UIEdgeInsetsZero];
}
if([cellrespondsToSelector:
@selector(setSeparatorInset:
)]){
[cellsetSeparatorInset:
UIEdgeInsetsZero];
}
}
//自绘分割线
-(void)drawRect:
(CGRect)rect
{
CGContextRefcontext=UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context,[UIColorwhiteColor].CGColor);
CGContextFillRect(context,rect);
CGContextSetStrokeColorWithColor(context,[UIColorcolorWithRed:
0xE2/255.0fgreen:
0xE2/255.0fblue:
0xE2/255.0falpha:
1].CGColor);
CGContextStrokeRect(context,CGRectMake(0,rect.size.height-1,rect.size.width,1));
}
iOS7.0以后的UILabel会自动将Text行尾的空白字符全部去除,除了常见的半角空格(\0×20)和制表符(\t)之外,全角空格(\u3000)也被计算在内,甚至连多余的换行符(\r,\n)也被自动去除了。
这一点虽然方便直接将控件赋值和无需取值后再trim,但是太过智能化了之后,往往不能满足一些本可以简单实现的需求。
需求1.使用添加\n方式将上下文本连续空两行,即实现文本的2倍行距。
iOS7.0之前解决办法:
在每个换行符后面添加一个空格
即如果要显示为:
aaaaaaa
空行
空行
bbbbbb
使用以下格式进行文本赋值
lbl.text=@"aaaaaaa\n\u0020\n\u0020bbbbbb";
iOS7.0之后需要增加,不增加则无效
lbl.numberOfLines=0;//0表示行数不固定
lbl.lineBreakMode=UILineBreakModeWordWrap;//允许换行(可选)
需求2.在所有的UILabel的text后增加一个空格,并使text右对齐。
iOS7.0之前解决办法:
直接在text后增加空格即可,即text在赋值前增加空格。
lbl.text=[NSStringstringWithFormat:
@"%@%@","aaaaa","\u0020"];
iOS7.0之后需要重写UILabel的drawTextInRect方法,通过缩短默认文本绘制Rect的宽度半个字体宽度来实现。
(当然也可以在底部铺一个view调整,暨简单又高效)
具体实现代码如下:
[objc]viewplaincopy
#import"MyLabel.h"
@implementationMyLabel
-(id)initWithFrame:
(CGRect)frame{
self=[superinitWithFrame:
frame];
if(self){
returnself;
}
}
-(void)drawTextInRect:
(CGRect)rect{
//从将文本的绘制Rect宽度缩短半个字体宽度
//self.font.pointSize/2
return[superdrawTextInRect:
CGRectMake(rect.origin.x,rect.origin.y,rect.size.width-self.font.pointSize/2,rect.size.height)];
}
@end
//附录:
//UILabel会自动清除的空白字符(UNICODE)
\u0009CHARACTERTABULATION
\u000ALINEFEED
\u000DCARRIAGERETURN
\u0020SPACE
\u0085NEXTLINE
\u00A0NBSP
\u1680OGHAMSPACEMARK
\u180EMONGOLIANVOWELSEPARATOR
\u2000ENQUAD
\u200AHAIRSPACE
\u200BZEROWIDTHSPACE
\u2028LINESEPARATOR
\u2029PARAGRAPHSEPARATOR
\u202FNARROWNO-BREAKSPACE
\u205FMEDIUMMATHEMATICALSPACE
\u3000IDEOGRAPHICSPACE
监听UITextField的text的变化:
[objc]viewplaincopy
//注册监听
[[NSNotificationCenterdefaultCenter]postNotificationName:
UITextFieldTextDidChangeNotificationobject:
nil];
[[NSNotificationCenterdefaultCenter]addObserver:
selfselector:
@selector(changeForKeyWord:
)name:
UITextFieldTextDidChangeNotificationobject:
nil];
//监听关键词变化
-(void)changeForKeyWord:
(NSNotification*)sender
{
//关键词改变时清除地区查询条件纪录
[[NSUserDefaultsstandardUserDefaults]setObject:
@"0"forKey:
@"proRow"];
[[NSUserDefaultsstandardUserDefaults]setObject:
@"0"forKey:
@"section"];
}
//监听UITextField的点击事件
[[NSNotificationCenterdefaultCenter]postNotificationName:
UITextFieldTextDidBeginEditingNotificationobject:
nil];
[[NSNotificationCenterdefaultCenter]addObserver:
selfselector:
@selector(enterEdited:
)name:
UITextFieldTextDidBeginEditingNotificationobject:
nil];
-(void)enterEdited:
(NSNotification*)sender
{
//事件写这里!
希望帮到你!
}
改变cell的选中颜色:
[objc]viewplaincopy
cell.selectedBackgroundView=[[UIViewalloc]initWithFrame:
cell.frame];
cell.selectedBackgroundView.backgroundColor=COLOR_BACKGROUNDVIEW;
//不需要任何颜色可以这么设置:
cell.selectionStyle=UITableViewCellSelectionStyleNone;
旋转图片:
[objc]viewplaincopy
#pragmamark-----更新按钮动画
-(void)rotate360DegreeWithImageViews:
(UIImageView*)myViews{
CABasicAnimation*rotationAnimation=[CABasicAnimationanimationWithKeyPath:
@"transform.rotation.z"];
rotationAnimation.toValue=[NSNumbernumberWithFloat:
M_PI*2.0];
rotationAnimation.duration=1.0;
rotationAnimation.cumulative=YES;rotate360DegreeWithImageViews
rotationAnimation.repeatCount=100000;
[myViews.layeraddAnimation:
rotationAnimationforKey:
@"rotationAnimation"];
}
[myViews.layerremoveAllAnimations];//停止
UIView的exclusiveTouch属性
通过设置[selfsetExclusiveTouch:
YES];
可以达到同一界面上多个控件接受事件时的排他性,从而避免一些问题。
[objc]viewplaincopy
//1.设置的时候在ib里面记得选择无边框的,要不然随便你设置,都是无效的,也是坑死了。
_textBoxName.layer.borderWidth=1.0f;
_textBoxName.layer.borderColor=[UIColorcolorWithRed:
0xbf/255.0fgreen:
0xbf/255.0fblue:
0xbf/255.0falpha:
1].CGColor;
//2.在uitextfield中文字最左边距离左侧边框的距离
_textBoxName.leftView=[[UIViewalloc]initWithFrame:
CGRectMake(0,0,16,51)];
_textBoxName.leftViewMode=UITextFieldViewModeAlways;
当你使用UISearchController在UITableView中实现搜索条,在搜索框已经激活并推入新的VC的时候会发生搜索框重叠的情况
解决办法:
那就是definesPresentationContext这个布尔值。
画个曲线如何做呢?
如图:
[objc]viewplaincopy
UIView*myCustomView=[[UIViewalloc]initWithFrame:
CGRectMake(0,204,kScreenWidth,120)];
myCustomView.backgroundColor=[UIColorwhiteColor];
[viewaddSubview:
myCustomView];
UIBezierPath*bezierPath=[UIBezierPathbezierPath];
[bezierPathmoveToPoint:
CGPointMake(0,0)];
[bezierPath
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- iOS 开发 遇到 那些