ios开发学习笔记

2019年11月18日 阅读数:29
这篇文章主要向大家介绍ios开发学习笔记,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

come from :http://blog.csdn.net/mad1989/article/details/7972612

 

1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,但是发现clear Color没法使用)

其实在代码里仍是能够设置的,那就是删除背景viewphp

[[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];
html



2,NSDate使用

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. 字母  日期或时间元素    表示     示例       
  2. G     Era   标志符     Text     AD       
  3. y     年     Year     1996 96       
  4. M     年中的月份     Month     July;   Jul; 07       
  5. w     年中的周数     Number     27       
  6. W     月份中的周数        Number     2       
  7. D     年中的天数     Number     189       
  8. d     月份中的天数        Number        10       
  9. F     月份中的星期     Number        2       
  10. E     星期中的天数    Text     Tuesday;   Tue       
  11. a     Am/pm   标记        Text     PM       
  12. H     一天中的小时数(0-23)     Number       0       
  13. k     一天中的小时数(1-24)      Number     24       
  14. K     am/pm   中的小时数(0-11)     Number    0       
  15. h     am/pm   中的小时数(1-12)     Number    12       
  16. m     小时中的分钟数        Number     30       
  17. s     分钟中的秒数         Number     55       
  18. S     毫秒数         Number     978       
  19. z     时区     General   time   zone     Pacific   Standard   Time;   PST;   GMT-08:00       
  20. Z     时区     RFC   822   time   zone     -0800       


 


[注意]在开发中,若是使用年月日,用NSDateFormatter setFormat :@"yyyy-MM-dd",若是是使用小时和分钟,设置为:"HH:mm",切记不要设置“HH-mm”,这样会出错的。java


举例:ios

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. //建立一个时间对象  
  2.     NSData * date = [NSDate date];  
  3.     //打印时间  
  4.     NSLog(@"today is %@",date);  
  5.       
  6.     //再获取的时间date减去24小时的时间(昨天的这个时候)  
  7.     NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(24*60*60)];  
  8.     NSLog(@"yesterday is %@",yesterday);//打印昨天的时间  
  9.       
  10.     /*字符串换成时间*/   
  11.     //设置一个字符串的时间  
  12.     NSString *datestring = [NSString stringWithFormat:@"1999-09-03"];   
  13.     //想要设置本身想要的格式,能够用nsdateformatter这个类,这里是初始化  
  14.     NSDateFormatter * dm = [[NSDateFormatter alloc]init];   
  15.     //指定输出的格式   这里格式必须是和上面定义字符串的格式相同,不然输出空  
  16.     [dm setDateFormat:@"yyyy-MM-dd"];  
  17.     //把字符串的时间转换成Date对象,用dateFromString方法  
  18.     NSDate * newdate = [dm dateFromString:datestring];  
  19.     //输出  
  20.     NSLog(@"newdate is %@",newdate);  
  21.       
  22.       
  23.     /*把时间转换成字符串*/  
  24.     //把Date对象转换成String对象  用stringFromDate方法  
  25.     NSString * datestring2 = [dm stringFromDate:newdate];  
  26.     //打印  
  27.     NSLog(@"datestring2 is %@",datestring2);  

 


3,UTTabviewCell 未实例化

如 果使用 UTTabviewCell,设置其accessory样式为:Detail Disclosure ,就是在每个cell右边设置一个detail button。若是这样的操做是使用storyboard,进行的,它会要求你给每个你cell设置indentifier,而后你会在如下方法内设置 重用indentfier,别忘记加上一句话,不然编译运行时可能会弹出: cell未实例化c++



4,StoryBoard中segue的使用

在 开发项目中,有时有这样的需求:运行程序,登录界面是一个自由的ViewController,只是摆放几个TextField和button,点击后跳 转到其它选择界面,点击选项后进入咱们的主界面:这个时候,在登录界面做跳转时,会有好多的方法,若是使用storyboard,就比较方便了,设置一个 segue,跳转代码中git

[self PerformSegueWithIdentifier:@"targetViewController",self]; 就能够了,但是我想实例化想要跳转的控制器,而后设置某一属性的值,这样跳转后控制器获取那个属性,就会获得值了,但是这样作会有一个问题:正则表达式

主界面控制器若是使用了navigatorViewController,而且是其 RootViewController,等到在主界面设置功能,点击某一功能,想push到一个新页面时,问题就来了,你会发现毫无反应,没有报错,只是 segue没法跳转。后来终于找到缘由:就是我在登录控制器跳转时没有使用segue的方法,而是用代码self.storyboard,加载一个新类, 具体原理目前尚未搞明白,先把出问题的代码记录下来,回头补之:算法


代码这样作,会致使其后没法使用navigatorViewController作push跳转编程



5,nil和Nil和NULL的判断

开 发过程当中,咱们经过http请求,后台返回json数据,而有时数据里某一字段的值为null~,而后咱们把此值赋值给 NSArray,NSdictionary,或是NSString,而后咱们会判断此值为null时,所作的处理,而一般惯性思惟判断时咱们都会 写:if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil),咱们发现,都很差用,根本没有起到判断的做用~后来我才发现,原来不能这样来判断。json

简单点说,就是当字典,数组为null时,后台打印的输出结果是这样:


而后,咱们须要在代码判断时利用[NSNull null]来判断,具体如:


isEqual:[NSNull null] 就搞定了,nsarray也是一样的道理。


控制台打印:str=(null) 表明着 字符串或数组或字典是一个空指针,(而非空字符串)判断的时候,直接用:

if(str == nil)就能够了。以下图所示:



而控制台打印:str =  <null>,表明着这是一个空字符串,赋值为空,指针是存在的,只是内容为空,这种判断须要使用:

if(str is equal [NSNull null ]) ,由于在ios上,内容为空不能简单的判断str==null(null 在ios上得用[NSNull null])


通常这种状况是,服务器那边是null,直接返回@"null"的字符串,这样在ios这边很差判断,最好跟后台沟通,若是遇到null值,返回@"",好作判断


 




6,给uiview设置圆角样式

只需在加载时,添加这样的话就能够了:

testView.layer.cornerRadius = 6;
        testView.layer.masksToBounds = YES;

注意,须要 import <QuartzCore/QuartzCore.h> 导入,不然,不能识别cornerRadius和masksToBounds。

 

uiview设置背景图片:

 [theMainView setBackgroundColor: [UIColor colorWithPatternImage: [UIImage imageNamed: @"bg.png"]]];

 

imageName 缓存,下面方法不缓存

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"jpeg"]; 
UIImage *prodImg = [[UIImage alloc] initWithContentsOfFile:thePath"];  
controller.productImg.image = prodImg;   
[prodImg release]; 


7,隐藏键盘的两种方法

 1-1Did End On Exit 调用下面事件当点击键盘return得时候就会隐藏键盘
- (IBAction)textFieldShouldReturn:(UITextField *)textField {
    //[sender resignFirstResponder];
    if (textField == chi) {
        [chi resignFirstResponder];
        double m=[chi.textdoubleValue]/3.003;
        double f=m *3.2808;
        meter.text=[[NSStringalloc] initWithFormat:@"%.4f",m];
        feet.text=[[NSStringalloc] initWithFormat:@"%.4f",f];
    }
    if (textField == meter) {
        [meter resignFirstResponder];
        
    }
    if (textField == feet) {
        [feet resignFirstResponder];
    }
}
1-2 点击屏幕得时候隐藏键盘
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch=[[event allTouches] anyObject];
    if (touch.tapCount >=1) {
        [chi resignFirstResponder];
        [meter resignFirstResponder];
        [feet resignFirstResponder];
    }
}

1-2的方法至关于屏幕任何位置的点击事件(除了各组件的点击处)能够在这个方法里执行要隐藏或remove的view。




8,UITextField密文显示输入内容


只须要在TextField属性中的Secure(安全的)勾选上就能够了。显示apple默认的密文显示方式。


9,经过系统自带的NSPredicate使用正则表达式

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. NSString *regex =[NSString stringWithFormat:@"^1(3[4-9]|5[012789]|8[2378]|47)\\d{8}$"];  
  2. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];  
  3. BOOL isMatch = [predicate evaluateWithObject:editPhoneField.text];  


 

10,项目设置应用程序显示名称

     1,在项目的Supporting Files下寻找infoPlist.strings文件,打开后会看到一片空白(英文默认是跟随项目名称显示)。此时,能够就地添加一句代码:CFBundleDisplayName="爱贝通";

     这样的话,不管手机设置英文语言仍是中文语言,应用程序都会显示设置的名称。

     2,为了国际化而言,咱们最好建立一个chinese专有的infoPlist.strings文件。

如上图所示,添加一个中文的plist

而后打开添加代码:

这个时候,大功告成。部署在模拟器或真机中吧,你的手机设置(中/英)文语言,它就会调用相应的配置文件。


11,更改Xcode的缺省公司名

        

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. //  testAppDelegate.m    
  2. //  test    
  3. //    
  4. //  Created by gaohf on 11-5-24.    
  5. //  Copyright 2011 __MyCompanyName__. All rights reserved.  

        在终端中执行如下命令:

 

        

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{"ORGANIZATIONNAME" = "COMPANY";}'   

         

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. //    
  2. //  testAppDelegate.m    
  3. //  test    
  4. //    
  5. //  Created by gaohf on 11-5-24.    
  6. //  Copyright 2011 COMPANY. All rights reserved.    
  7. //    




12,在有uinavigation,uitoolbar的状况下,如何添加一个全屏的 uiview (做为显示一个进度框,任何区域没法触摸而使用)

            只须要在要添加view时侯这样写:

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. [[UIApplication sharedApplication].keyWindow addSubview:waitingview];  

 

 

        这样,直接把waitingview添加到了uiWindow上,而不是self.view上。再次运行,会发现屏幕所有区域都已经遮挡住了。

        

13,使用了storyboard,运行程序模拟器显示黑屏

这是因为,操做不当,获取点击了例如  navigationViewController属性种的in init ViewController选项,而后重置了当前进入程序后的首界面,解决办法就是选择入口界面,属性种从新勾选此选项。

 

StoryboardApp[8593:207] Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?

StoryBoard中没有一个view controller设置了Initial Scene。您须要选择一个view conroller做为story board的第一个界面:

 


14,如何给uiNavigationBar 设置背景颜色或是自定义图片

在项目中添加以下代码:

//设置背景颜色:

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. UIColor *itemcolor = [UIColor colorWithRed:100.0f/255.0f green:176.0f/255.0f blue:0.0f/255.0f alpha:0.3f];  
  2. self.navigationController.navigationBar.tintColor = itemcolor;  


//设置自定义的图片:

 

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbg.png"] forBarMetrics:UIBarMetricsDefault];  


5.0以上,api有了上面setBackgroundImage的方法,能够直接设置,若是项目须要适配5.0如下版本的设备,最好加一个判读,是否有此函数,有则设置,没有就经过drawRect方法设置。

 


另外:设置背景图片没法匹配backButton或rightButtonItem,因此返回按钮或右边自定义的Bar button Item须要自行处理。

 

15,如何给uiview设置背景图片

在storyboard或xib中,添加一个uiview,属性设置栏通常都有设置背景颜色,样式,透明度alpha,可是没有提供设置image,只有在imageview中才有,因此,要想设置背景图片,只能在代码中设置,以下:

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. [leftNaviView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"pabb_leftnaviview_bg.png"]]];  


这样,背景就能够变成想要的图片了。另外,设置大小:

 

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. [leftNaviView setFrame:CGRectMake(9, 60, 120, 250)];  

 


效果图:




16,如何在项目用代码打开AppStore

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1.         //如下是经过id打开此软件的评价  
  2. //        int m_appleID = 576337094;  
  3. //        NSString *str = [NSString stringWithFormat:  
  4. //                                 @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d",  
  5. //                                 m_appleID ];  
  6.         //如下是经过appstore连接到本身应用在商店的位置  
  7.         NSString *url = [NSString stringWithFormat:@"http://itunes.apple.com/cn/app/huo-xing-she-xin-dian/id549425594?l=en&mt=8"];  
  8.         [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];  

把以上代码直接拷贝到想要实现点击跳转的操做方法内就能够了,经过appID,随意能够经过appstore打开应用,直接用url就能够连接到了。很简单,通常都用在检查更新的时候。

 


17,如何代码实现跳转safari,phone或message?

在相应的代码中写入:

一、调用 电话phone
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://4008008288"]];

二、调用自带 浏览器 safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.abt.com"]];

三、调用 自带mail
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@abt.com"]];

四、调用 SMS
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];

5,跳转到系统设置相关界面

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];


其中,发短信,发Email的功能只能填写要发送的地址或号码,没法初始化发送内容,若是想实现内容的话,还须要更复杂一些,实现其各自的委托方法。

若须要传递内容能够作以下操做:
加入:MessageUI.framework
 
#import <MessageUI/MFMessageComposeViewController.h>
 
实现代理:MFMessageComposeViewControllerDelegate

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. 调用sendSMS函数  
  2. //内容,收件人列表  
  3. - (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients  
  4. {  
  5.    
  6.     MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];  
  7.    
  8.     if([MFMessageComposeViewController canSendText])  
  9.    
  10.     {  
  11.    
  12.         controller.body = bodyOfMessage;     
  13.    
  14.         controller.recipients = recipients;  
  15.    
  16.         controller.messageComposeDelegate = self;  
  17.    
  18.         [self presentModalViewController:controller animated:YES];  
  19.    
  20.     }     
  21.    
  22. }  
  23.    
  24. // 处理发送完的响应结果  
  25. - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result  
  26. {  
  27.   [self dismissModalViewControllerAnimated:YES];  
  28.    
  29.   if (result == MessageComposeResultCancelled)  
  30.     NSLog(@"Message cancelled")  
  31.   else if (result == MessageComposeResultSent)  
  32.     NSLog(@"Message sent")    
  33.   else   
  34.     NSLog(@"Message failed")    
  35. }  
  36.    
  37.    
  38. 发送邮件的为:  
  39. 导入#import <MessageUI/MFMailComposeViewController.h>  
  40. 实现代理:MFMailComposeViewControllerDelegate  
  41.    
  42. //发送邮件  
  43. -(void)sendMail:(NSString *)subject content:(NSString *)content{  
  44.    
  45.     MFMailComposeViewController *controller = [[[MFMailComposeViewController alloc] init] autorelease];  
  46.    
  47.     if([MFMailComposeViewController canSendMail])  
  48.    
  49.     {  
  50.    
  51.         [controller setSubject:subject];  
  52.    
  53.         [controller setMessageBody:content isHTML:NO];  
  54.    
  55.         controller.mailComposeDelegate = self;  
  56.    
  57.         [self presentModalViewController:controller animated:YES];  
  58.    
  59.     }      
  60. }  
  61.    
  62. //邮件完成处理  
  63. -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{  
  64.    
  65.     [self dismissModalViewControllerAnimated:YES];  
  66.    
  67.     if (result == MessageComposeResultCancelled)  
  68.         NSLog(@"Message cancelled");  
  69.     else if (result == MessageComposeResultSent)  
  70.         NSLog(@"Message sent");   
  71.     else   
  72.         NSLog(@"Message failed");    
  73.    
  74. }  
  75.    
  76. 默认发送短信的界面为英文的,解决办法为:在.xib 中的Localization添加一組chinese  



18,注册设置应用程序访问用户手机发送推送消息(弹出Alertview)

 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];


19,轻松自定义复选框按钮

-(void)checkboxClick:(UIButton *)btn
{
    btn.selected = !btn.selected;
}


- (void)viewDidLoad {
UIButton *checkbox = [UIButton buttonWithType:UIButtonTypeCustom];
    
    CGRect checkboxRect = CGRectMake(135,150,36,36);
    [checkbox setFrame:checkboxRect];
    
    [checkbox setImage:[UIImage imageNamed:@"checkbox_off.png"] forState:UIControlStateNormal];
    [checkbox setImage:[UIImage imageNamed:@"checkbox_on.png"] forState:UIControlStateSelected];
    
    [checkbox addTarget:self action:@selector(checkboxClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:checkbox];    
}


20,程序中获取软件的版本号和app名称

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. 应用程序的名称和版本号等信息都保存在mainBundle的infoDictionary字典中,用下面代码能够取出来。  
  2. NSDictionary* infoDict =[[NSBundle mainBundle] infoDictionary];  
  3. NSString* versionNum =[infoDict objectForKey:@"CFBundleVersion"];//版本名称  
  4. NSString*appName =[infoDict objectForKey:@"CFBundleDisplayName"];//app名称  
[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. <p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;"><span style="color: #703daa">NSString</span> * versionShortString = [infoDict <span style="color: rgb(61, 29, 129);">objectForKey</span>:<span style="color: #d12f1b">@"CFBundleShortVersionString"</span>];//标识应用程序发布版本号</p>NSString*text =[NSString stringWithFormat:@"%@ %@",appName,versionNum,<span style="font-family: Menlo; font-size: 11px; white-space: pre; rgb(240, 240, 240);">versionShortString</span>];  


此version 为工程info下的Bundle version字段值:value能够随意定义。

 



 

CFBundleVersion,标识(发布或未发布)的内部版本号。这是一个单调增长的字符串,包括一个或多个时期分隔的整数。

CFBundleShortVersionString  标识应用程序的发布版本号。该版本的版本号是三个时期分隔的整数组成的字符串。第一个整数表明重大修改的版本,如实现新的功能或重大变化的修订。第二个整数表示的修订,实现较突出的特色。第三个整数表明维护版本。该键的值不一样于“CFBundleVersion”标识。

   图片里的 Version 对应的就是CFBundleShortVersionString (发布版本号 如当前上架版本为1.1.0  以后你更新的时候能够改成1.1.1)
   Build 对应的是 CFBundleVersion(内部标示,用以记录开发版本的,每次更新的时候都须要比上一次高 如:当前版本是11  下一次就要大于11 好比 12,13 ....10000)



21,如何使屏幕一直保持唤醒状态?(就是不自动黑屏)

好比,若是咱们作一个播放视频的功能时,想在播放的时候,不会自动进入屏保(黑屏)

只要在代码里加入这一行:

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. [[UIApplication sharedApplication] setIdleTimerDisabled:YES];  


固然,在想要黑屏的时候还须要把它设置为NO(好比视频播放完毕时),否则屏幕会在此软件运行下一直亮着。

 


22,在Xcode中,文件名后小方框中的A(M或C)表示什么意思啊?


 表示在版本控制中,自上一次提交以来,文件作了修改。貌似只有在带有版本控制的项目代码中才会显示,也就是说你的项目使用了SVN、GIT等工具后,会在Xcode中识别出来。

'A'  新增

'D'  删除

'M'  修改

'R'  替代

'C'  冲突

'I'  忽略

'?'  未受控

'!'  丢失,通常是将受控文件直接删除致使 


23,有关ios5上屏幕旋转,view设置Frame的相关问题


屏幕旋转一共有4个相关属性(旋转方向):

 

UIInterfaceOrientationLandscapeLeft

UIInterfaceOrientationLandscapeRight

UIInterfaceOrientationPortrait

UIInterfaceOrientationPortraitUpsideDown

前两个是横屏时的状态,后两个是正常状态(Portrait)和上下颠倒(UpsideDown)时的状态。

【注意:Left和Right两个左右模拟器旋转时移动的方向正好是相反的,但移动后Home的方向,就以下图所示】

具体见下图:



其中涉及到两个方法,在ViewController中默认会实现这个方法:

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  2. {  
  3.     //除了不容许旋转屏幕后:上下颠倒,其他方向都运行旋转  
  4.     //若是想都运行,能够直接返回YES,或都不容许NO  
  5.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  6.       
  7. }  

这个方法是声明此ViewController所运行屏幕旋转的方向,一共4种类型,所有容许返回YES,上图所示除了不容许上下颠倒,其他均可以。【注意,项目设置Supported Device Orientations 所支持的屏幕旋转类型并不影响此方法的设置,也就是说,哪怕Support只支持Portrait,方法里设置UpsideDown,此ViewController也会实现上下颠倒旋转的】

 


第二个方法,是咱们比较经常使用的,也就是在设备即将以某个方向旋转以前,咱们在其状态(方向)设置组件或view的Frame,bound,等须要改变的属性时所用到的方法。

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{  
  2.   
  3.     //屏幕旋转到横屏时  
  4.     if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {  
  5.         myMapview.frame = CGRectMake(0,0,480, 300);  
  6.     }  
  7.     //屏幕旋转到竖屏时  
  8.     else{//== else if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation))  
  9.         myMapview.frame = CGRectMake(0, 0, 320,460);  
  10.     }  
  11.   
  12. }  

全部旋转屏幕后须要改变组件尺寸属性的设置均可以在这个方法里面实现。


【注意,以上两个方法,在最新的ios6貌似已经不提倡使用了,除非要适应旧设备,新的旋转屏幕的相关方法能够网络搜索一下】

http://blog.csdn.net/zzfsuiye/article/details/8251060  IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6以前系统)

http://blog.csdn.net/huifeidexin_1/article/details/7826159  ios旋转屏幕总结 详细教程

http://blog.csdn.net/xiaoyun8822/article/details/8213738 Ios5(三)屏幕的旋转和大小设置;

以上为参考教程




24,Xcode编译警告和错误解决方法

1 Application windows are expected to have a root view controller at the end of application launch

 

解决方法:在ios5以上版本,应用程序加载时,须要一个 root view controller ,因此须要编写代码

_rootViewController = [[RootViewController alloc] init];

self.window.rootViewController = _rootViewController;

此问题大可能是在Xib或Storyboard下操做ViewController时不当心链接RootViewController 的底层View所致使的,检查删除没有做用的view链接线,或是Clean,再运行。



25,如何设置视图(view)在最上层?或是view1和view2交换?

情景再现:

咱们在storyboard的一个视图里添加了一个view1用做快捷功能导航;而后在对应的viewController里实例化了一个Mapview的地图view2,大小是整个屏幕,这样一来,就把咱们在storyboard中添加的view1覆盖了,这个时候,咱们想把view1在地图view2的上面,该怎么作?

简而言之就是window中subview的交换。


首先经过:NSLog(@"subviews:%@",self.view.subviews); 这个咱们能够看到当前下全部的subview(NSArray类型)以下图所示:



能够看到一共有3个view:UILabel 地图view2,添加的view1

咱们如今要作的就是把后二者对调一下,因此在self.view 中寻找一下看有没有replace相关的方法


就是这个方法,第一个参数是要进行调换的地图view2,第二个参数是调换后显示的view1。

 

 [self.viewexchangeSubviewAtIndex:1withSubviewAtIndex:2];

由于经过log打印,咱们已经知道Mapview在第一个下标的位置,view1在第二个下标的位置。


大功告成。记住这个方法:self.view exchangeSubviewAtIndex:withSubviewAtIndex:];



26,如何隐藏UINavigationBar

有的时候,咱们的视图使用了Navigation Controller ,可是主界面(rootviewcontroller)或其它push进入的界面 想使用一个全屏的view,就是说,不显示顶部的navigationBar,这个时候,就须要咱们来隐藏了。

 

//隐藏NavigationBar

-(void) viewWillAppear:(BOOL)animated{

    

    [self.navigationControllersetNavigationBarHidden:YESanimated:YES]; //设置隐藏

    [super viewWillAppear:animated];

}

-(void) viewWillDisappear:(BOOL)animated{


    [self.navigationControllersetNavigationBarHidden:NOanimated:YES];

    [super viewWillDisappear:animated];

        

}



27,如何限制UITextField输入长度(监听textField文本变化的事件)

一、实现UITextFieldDelegate协议;


二、实现textField:shouldChangeCharactersInRange:replacementString:方法;

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{  
  2.     int kMaxLength = 11;  
  3.       
  4.   
  5.     NSInteger strLength = textField.text.length - range.length + string.length;  
  6.     //输入内容的长度 - textfield区域字符长度(通常=输入字符长度)+替换的字符长度(通常为0)  
  7.  return (strLength <= kMaxLength);}  

 

 

如上代码,若是咱们简单的这样写: if(range.location<=11) return  或是 if (textfield.text.length>=11) 这样虽然也能限制位数为11位,可是若是经过放大镜把光标切换到以前的位数后,你照样能够输入,而且还会致使输入11位后,键盘上的退格(X键)没法使用,缘由是:咱们在location到达11位后,返回了NO,键盘没法相应:添加,修改,删除。这是很严重的。因此照着我上面的。

方法解读:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
功能:


  把textField中位置为range的字符串替换为string字符串;


  此函数在textField内容被修改时调用;


返回值:

  YES,表示修改生效;NO,表示不作修改,textField的内容不变。

参数说明:
  textField:响应UITextFieldDelegate协议的UITextField控件。
  range:    UITextField控件中光标选中的字符串,即被替换的字符串;

          range.length为0时,表示在位置range.location插入string。

  string:    替换字符串; string.length为0时,表示删除。



28,使用ios5.0之后的一个方法自定义table View Cell

 

  1. UINib *nib = [UINib nibWithNibName:@"TvWeiboCell" bundle:nil];  
  2.         [tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];  

 



29,iOS和iPad各app图标和启动页尺寸

iphone APP图标尺寸:57X57    高清:114X114  单位:pixel   命名:无特殊要求,最好是,app_icon  高清的要加@2x

iphone 启动页尺寸:大小最好是320X460或320X480(至关于整个屏幕尺寸) 单位:pixel 命名:Default.png 

iPad APP图标尺寸:72X72 高清:144X144  单位:pixel 命名:

ipad 启动页尺寸:大小最好是768X1004或768X1024  单位:pixel 命名:Default-Portrait~ipad.png   高清:Default-Portrait@2x~ipad.png


30,如何用NSLog输出NSRange,CGRect等结构体

NSString 中的方法:

NSStringFromCGPoint   
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform   
NSStringFromUIEdgeInsets


如:NSLog(@"rect1: %@", NSStringFromCGRect(rect1));




31,如何在navigationviewcontroller中,pop到以前不一样的viewcontroller(push过的viewcontroller)?


如上图所示,回退到界面2,很简单:  [self.navigationControllerpopViewControllerAnimated:YES];  直接就回退到界面2了,但是咱们既不想回到rootviewcontroller,也不想回到界面2,只想回到界面1,该如何作?

笨方法:在界面1要跳转到界面2时,把本身self,set到界面2(前提界面2要设置一个id类型的属性,用来存放界面1self,以此类推,当在界面3想退到界面1时,

[self.navigationControllerpopToViewController:controlleranimated:YES];


其实如今刚明白,一个很简单的方法:

 

  1. NSArray *viewControllers=[self.navigationController viewControllers];  
  2. UIViewController *controller=[viewControllers objectAtIndex:1];  

 

想起来navigation的机制了吧,每当咱们push到一个viewcontroller时,就会把这个viewcontroller的实例保存到nsarray里,经过array能够获取到任何一个viewcontroller,这不就解决问题了么?

 

  1. [self.navigationController popToViewController:controller animated:YES];  


【注意】千万不要在这个地方实例化 界面1 而后popToViewController,这种方法是不对的。


32,self.navigationItem.backBarButtonItem 的title设置

 

新写的App中须要使用UINavigationController对各个页面进行导航,但因为第一级页面的title较长,在进入第二级页面后返回按钮leftButtonItem的title就会变得很长,对NavigationBar空间占用很大,并且不美观,因而使用代码对leftButtonItem的title文本进行修改,不管是设置self.navigationItem.leftBarButtonItem.title = @"返回";仍是self.navigationItem.backBarButtonItem.title = @"返回";都没有效果,title文本始终不会发生变化。到网上乱搜一通后,获得了如下解决方法,相对来讲比较简单,特记录以下:

    在第一级页面的viewDidLoad方法中加入如下代码:

 

  1. UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];  
  2.  temporaryBarButtonItem.title =@"返回";  
  3.  self.navigationItem.backBarButtonItem = temporaryBarButtonItem;  
  4.  [temporaryBarButtonItem release];   // 也就是用一个新的按钮在进行导航前将原来的返回按钮替换掉就能够了。  

因此,经过这个咱们能够明白,self.navigationItem.backBarButtonItem是在一级页面设置的(提早设置下一个页面的返回按钮),而self.navigationItem.leftBarButtonItem/rightBarButton是在二级页面设置的,(随意设置本页面的左右按钮,左按钮将替代系统的返回按钮)

 

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

 

通常一个程序中有一个UIWindow,一个UINavigationController,一个根UIViewController,多个子UIViewController。

UIWindow是整个可视界面的容器,里面放置咱们看到的UIView。
UIView负责处理屏幕上一个矩形区域的绘制,UIView中还可包含子UIView。
UIWindow是UIView类的扩展,能够看做是整个屏幕的根UIView。
UIViewController负责管理UIView的层次结构。能够有多个UIViewController。

一个UIViewController中有一个顶部的UINavigationBar、一个根UIView,多个子UIView。
UINavigationController是用于构建分层应用程序的主要工具,它维护了一个UIViewController栈。
这个栈中必须有一个根UIViewController,其余的UIViewController都是子UIViewController。

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

33,self.navigationItem和self.navigationController.navigationItem的区别?

 

/**********************************************/

self.navigationItem

self.navigationController.navigationItem

self.navigationController.navigationBar

/**********************************************/


1,  不要混淆 self.navigationItem  self.navigationController.navigationItem ,


UINavigationItem 自己是用来 定制 ViewController本身在被导航过程当中的 appearence, navigationItem是 UIViewController关于UINavigationControllerItem类别的扩展:


@interface UIViewController (UINavigationControllerItem)


@property(nonatomic,readonly,retain)UINavigationItem * navigationItem;


...


@end


因此后者 是调用 VC的所在的导航控制器导航控制器本身本身做为VC的 navigationItem,是导航的叠加。


2. UINavigationBar 继承于 UIView,隶属于整个 UINavigationController ,用来定义整个导航过程当中的导航栏的颜色等其余数值,(相似于 self.tabBarController.tabBar  UINavigationBar ,只须要一个设置通用的基本属性),只能经过self.navigationController.navigationBar来访问。


亦所以,定制于导航堆栈里某个VC 的时候,通常经过self.navigationItem,   好比经常使用的self.navigationItem.leftBarButtonItem,self.navigationItem.rightButtonItem, 同时若是本身来定制导航栏的外观的话,就要用到self.navigationItem.titleView,这个能够直接用一个 CustomView 赋值于 self.navigationItem.titleView便可。


此时,若是须要,就得本身画导航过程当中的返回按钮了。

 



34,图片模糊化处理

 

  1. +(UIImage *)scale:(UIImage *)image toSize:(CGSize)size  
  2. {  
  3.     UIGraphicsBeginImageContext(size);  
  4.     [image drawInRect:CGRectMake(0, 0, size.width, size.height)];  
  5.     UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();  
  6.     UIGraphicsEndImageContext();  
  7.     return scaledImage;  
  8. }  


 

35,NSString转换大小写的用法

iOS 6中NSString对象有些新的使用方法,可让字符串转变成所有大写,所有小写,或者每一个单词首字母大写。
 
代码以下所示:
 

  1. NSString *str = @"mobile developer tips";  
  2.    
  3. // Convert string to uppercase  
  4. NSString *upperStr = [str uppercaseStringWithLocale:[NSLocale currentLocale]];  
  5. NSLog(@"upperStr: %@", upperStr);  
  6.    
  7. // Convert string to caps  
  8. NSString *capStr = [upperStr capitalizedStringWithLocale:[NSLocale currentLocale]];  
  9. NSLog(@"capStr: %@", capStr);  
  10.    
  11. // Convert string to lowercase  
  12. NSString *lowerStr = [capStr lowercaseStringWithLocale:[NSLocale currentLocale]];  
  13. NSLog(@"lowerStr: %@", lowerStr);  

运行结果:

 



36,如何获取手机硬件信息?

经过使用UIDevice: 

 

[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];//os version
[[UIDevice currentDevice] uniqueIdentifier];
[[UIDevice currentDevice] model];
[[UIDevice currentDevice] name];

真机上结果:
System Name: iPhone OS
System Version: 4.2.1
Unique ID: 9b5ded78d5fa0ac96250f8b4af0e46f40b96ea6d
Model: iPhone
Name: “wwk”的 iPhone

模拟器上结果:

System Name: iPhone OS
System Version: 4.2
Unique ID: 21FFE0FF-429B-5D0B-96D2-EADCA3203260
Model: iPhone Simulator
Name: iPhone Simulator

uniqueIdentifier:iPhone经过,向几个硬件标识符和设备序列号应用内部散列算法,而生成这一标识符。

http://blog.csdn.net/qiwancong/article/details/7914923 参考


37,真机调试:could not change executable permissions错误?

虽然更改了新demo的bundle identifier和以前的identifier同样,可是真机上还保留着以前调试时的demo,因此新的工程若是使用一样的identifier真机调试,须要先把机器上原来的demo删除,再使用新工程调试。

38,判断iphone5屏幕的宏定义

 

  1. #define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)  

 

在须要判断屏幕尺寸的地方:

 

  1. mymapview = [[BMKMapView alloc] initWithFrame:CGRectMake(0,0,320,460+(iPhone5?88:0))];  

 

iphone5的View为568,减去Nav(44)+任务栏(20),为504,相比iphone4s及之前版本的480,减去Nav+任务栏,为416,高出88(差异).

http://www.cnblogs.com/maxfong/archive/2012/10/04/2711379.html


39,invalid deployment target for -stdlib=libc++ (requires iOS 5.0 or later)错误


选中项目--target---build settings  找到C++Standard Library 改为:Compiler Default,再编译就不会有错误了.



40,如何调用系统声音?【iphone 调用系统铃声与震动功能】


首先要在工程里加入Audio Toolbox framework这个库,而后在须要调用的文件里
#import <AudioToolbox/AudioToolbox.h>

最后在须要播放提示音的地方编写以下代码:

AudioServicesPlaySystemSound(1000);//新邮件消息提示

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震动

注:括号中为系统声音的id,详见请参考如下网址http://iphonedevwiki.net/index.php/AudioServices。

http://blog.csdn.net/tskyfree/article/details/8096500

http://www.cnblogs.com/martin1009/archive/2012/06/14/2549473.html

http://www.cnblogs.com/chen1987lei/archive/2012/02/07/2341535.html


41,重复调用2次loadView和viewDidLoad

最好不要在UIViewController的loadView方法中改变状态栏的可视性(好比状态栏由显示变为隐藏、或者由隐藏变为显示),由于会致使重复调用2次loadView和viewDidLoad方法。

 

  1. 错误代码:  
  1. - (void)loadView {  
  2.       NSLog(@"loadView");  
  3.       // 隐藏状态栏  
  4.       [UIApplication sharedApplication].statusBarHidden = YES;  
  5.         
  6.       // .... 建立UIView  
  7.       self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds] autorelease];  
  8.       self.view.backgroundColor = [UIColor grayColor];  
  9.   }  
  10.     
  11.   - (void)viewDidLoad {  
  12.       [super viewDidLoad];  
  13.       NSLog(@"viewDidLoad");  
  14.   }  


打印信息:

 

 

1 2013-05-14 00:51:36.152 test[2251:c07] loadView  
2 2013-05-14 00:51:36.153 test[2251:c07] loadView  
3 2013-05-14 00:51:36.153 test[2251:c07] viewDidLoad  
4 2013-05-14 00:51:36.154 test[2251:c07] viewDidLoad

 

 

 

虽然运行效果是对的,可是系统连续调用了2次loadView和viewDidLoad方法,致使建立了2次UIView,形成了没必要要的开销。

缘由分析:

状态栏由显示变为隐藏,意味着屏幕的可用高度变长了,UIViewController的UIView的高度也要从新调整,所以系统会从新调用loadView方法建立UIView,建立完毕后再次调用viewDidLoad方法。

 

42,点击UIButton 没法产生触摸事件

 

若是在UIImageView中添加了一个按钮,你会发如今默认状况下这个按钮是没法被点击的,须要设置UIImageView的userInteractionEnabled为YES:

imageView.userInteractionEnabled = YES;

设置为YES后,UIImageView内部的按钮就能够被点击了

 

43,如何启动app时全屏显示Default.png(图片)?

大部分app在启动过程当中全屏显示一张背景图片,好比新浪微博会显示这张:


 

要想在iOS中实现这种效果,毫无压力,很是地简单,把须要全屏显示的图片命名为Default.png便可,在iOS app启动时默认会去加载并全屏显示Default.png。

也能够用其余名称来命名图片,在Info.plist配置一下便可:

 

配置事后,app启动时就会去加载并全屏显示lufy.png

在默认状况下,app显示Default.png时并不是真正的"全屏显示",由于顶部的状态栏并无被隐藏,好比下面的效果:

 

大部分状况下,咱们都想隐藏状态栏,让Default.png真正全屏显示。

说到这里,可能有人立刻就想到了一种办法:在AppDelegate的application:didFinishLaunchingWithOptions:方法中添加以下代码:

[UIApplication sharedApplication].statusBarHidden = YES; 

我只能说你的思路是对的,但实际上达不到想要的效果,你会发现显示Default.png时状态栏仍是存在的,等Default.png显示完毕后,状态栏才被隐藏。

我先解释下为何这种方法不可行,其实缘由很简单:

1> Default.png是在app启动过程当中加载的,并非在app启动完毕后再加载的

2> AppDelegate的application:didFinishLaunchingWithOptions:方法是在app启动完毕后才调用的

下面说一下解决方案,在Info.plist中增长一个配置便可:

 

这里的YES表示在app初始化(启动)的时候就隐藏状态栏。

固然,在Default.png显示完毕后状态栏仍是隐藏的。若是想从新显示状态栏,补上下面代码便可:

[UIApplication sharedApplication].statusBarHidden = NO; 
 
 
 

 

44,使用ASIHTTPRequest保存cookies

假如个人APP,第一次启动请求了登陆接口并获得了Cookie,而后我把APP关了,下次启动APP,我不请求登陆接口了,那上次获得的Cookie就不存在了。若是须要,那么2种方法,下次启动app,自动登入,这样能获得服务器分配给你的cookier(这一种是最好的,由于session也会过时),还有一种是你把上次登入的时候,拿到的cookier存起来,而后下次启动app的时候,手动给请求(ASIHTTP)添加cookie。

因此当第一次登陆成功后,能够把cookie保存到CoreData,SQLite,UserDefault等,等到下次网络请求时,读取:

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:UserInfoURL];
    [request setRequestMethod:@"POST"];
    [request addRequestHeader:@"Cookie" value:[NSString stringWithFormat:@"cookie=%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"cookie"]]];//把cookie的值放进Header里,这个cookie的值是一串很长的字符串。


45,UITextField只有当有字符输入后,键盘右下角的搜索/返回/done/等等键才可使用

 

TextField设置这个属性为YES就能够了,默认为NO

searchField.enablesReturnKeyAutomatically =YES;


46,相似QQ等IM软件,长度和高度不一的聊天气泡的图片是如何作的?拉伸?



实际上是一个小气泡png,而后拉伸中间部分,四个角不拉动,就是局部拉伸。ios自带方法,四个角能够不拉伸的,以下:



47,UITableView中有多个UITextField时,被挡住的TextField如何实现自动向上弹起?

首先要实现TextField的delegate,在方法:

 

  1. - (void)textFieldDidBeginEditing:(UITextField *)textField {  
  2.     [self.tableView setContentOffset:CGPointMake(0, 70) animated:YES];  
  3.     
  4. }  

 

这说明当开始输入时,tableview在原来的基础上向上抬起70个距离。多个UITextFiled能够经过判断来使用CGPoint的调整高度,我这写的是70.

tableview的scrollEnabled属性必定要是YES;要否则滚动不了了。

记得在return时复原tableview的位置:

 

  1. - (BOOL)textFieldShouldReturn:(UITextField *)sender {  
  2.     [self.tableView setContentOffset:CGPointMake(0, 0) animated:YES];  
  3.     return YES;  
  4. }  

 

48,ios如何在调试时,轻松找到程序在哪里崩溃?

咱们给本身的工程添加一个通用的断点:



 

一步步按上面图完成操做。

再运行程序

 

自动就断点到这里来了,

log信息是:

 

  1. 2013-05-20 11:14:19.635 GestureRecognizer[1491:c07] -[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a88df0  
  2. 2013-05-20 11:15:21.148 GestureRecognizer[1491:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a88df0'  

这样很简单就能发现程序崩溃是由于value没有 isEqualToString方法。若是没加上面这个通用的断点,那程序会直接断点到main函数去。

 

49,UIImageView 如何实现windows 桌面相似的背景壁纸屏幕(很小的图片会显示N多个)?

从UImageView上找ContentMode或clipToBounds是都无论用的,正确的办法是,不用UImageView,使用UIView,而后设置backgroundColor属性为咱们的图片,这样的话自动会以屏幕的方式显示。

 

  1. UIView *gridView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 195)];  
  2. gridView.backgroundColor = [UIColor colorWithPatternImage:BUNDLE_IMAGE(@"blue_grid")];  
  3. [self.view addSubview:gridView];  
  4. [gridView release];  


下图所示:(原图是一个6X6的方格)

 




50,UITableViewCell 的backgroundColor不起做用的问题?

在开发时,想要在tableview中的某一个Cell设置选中状态,而且Cell的背景颜色是一个自定义颜色。

 

  1. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  
  2.       
  3. <span style="white-space:pre">    </span>//省略....  
  4.       
  5.     cell.textLabel.font = [UIFont systemFontOfSize:6.0];  
  6.     cell.textLabel.text = @"13832207020";  
  7.   
  8.     if (indexPath.row==0) {  
  9.   
  10.         [cell setBackgroundColor:[UIColor colorWithRed:100.0f/255.0f green:176.0f/255.0f blue:0.0f/255.0f alpha:1.0f]];  
  11.     }  
  12.     else{  
  13.         [cell setBackgroundColor:[UIColor whiteColor]];  
  14.     }  
  15.       
  16.     return cell;  
  17. }  


这样的话,第1行cell就应该是咱们设置好的颜色,不过请注意,此方法在UITableViewStylePlain的风格下有效,在 UITableViewStyleGrouped的样式下是无效的!这个跟tableview的backgroundView和backgroundColor是没有关系的,我的猜测应该是在Grouped风格下,cell选中的颜色有系统的view遮罩,致使咱们设置的没法显示出来。

 

【补充】若是想在reload或init时设置tableview的某一cell为 selected状态,千万不要使用cell setSelected:YES animated:YES,使用tableview的方法:

 

  1. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];  
  2. terminalTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];  


51,UITableViewCell选中时contentView中各组件的高亮状态

使用系统或简单自定义的UITableViewCell时,当选中某一行Cell后,除了背景颜色改变外,Cell上全部的组件(数据)好比UILabel,UIbutton等都被自动显示成了其

Highlighted(高亮)状态下的效果,(若是想显示出效果,你的那些自定义的组件必需要设置高亮状态,好比highlightedTextColor,UIControlStateHighlighted等),因此这一点须要特别注意,若是不想要系统的这个自动特效,有两个解决办法:

1,组件不设置highlighted下的属性

2,若是自定义的Cell:

 

  1. - (void)setSelected:(BOOL)selected animated:(BOOL)animated  
  2. {  
  3.     
  4.     [super setSelected:selected animated:animated];  
  5.        
  6.     if (selected) {  
  7.         //强制系统在UITableViewCell选中时SettingButton组件的高亮状态为NO  
  8.         [(UIButton *)[self.contentView.subviews objectAtIndex:1] setHighlighted:NO];  
  9.         [settingBtn setImage:BUNDLE_IMAGE(@"accessory_sel") forState:UIControlStateNormal];  
  10.     }  
  11.     else{  
  12.         [settingBtn setImage:BUNDLE_IMAGE(@"accessory_nor") forState:UIControlStateNormal];  
  13.     }  
  14.       
  15.      
  16. }  


52,IOS atomic与nonatomic,assign,copy与retain的定义和区别

 

        atomic

                设置成员变量的@property属性时,默认为atomic,提供多线程安全。

                在多线程环境下,原子操做是必要的,不然有可能引发错误的结果。加了atomic,setter函数会变成下面这样:
                        {lock}
                                if (property != newValue) { 
                                        [property release]; 
                                        property = [newValue retain]; 
                                }
                        {unlock}

        nonatomic

        禁止多线程,变量保护,提升性能。

        atomic是Objc使用的一种线程保护技术,基本上来说,是防止在写未完成的时候被另一个线程读取,形成数据错误。而这种机制是耗费系统资源的,因此在iPhone这种小型设备上,若是没有使用多线程间的通信编程,那么nonatomic是一个很是好的选择。

        指出访问器不是原子操做,而默认地,访问器是原子操做。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器获得的返回值或者经过设置器设置的值能够一次完成,即使是别的线程也正在对其进行访问。若是你不指定 nonatomic ,在本身管理内存的环境中,解析的访问器保留并自动释放返回的值,若是指定了 nonatomic ,那么访问器只是简单地返回这个值。


assign
        对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等。
        此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,若是你要一个属性使用assign,且这个类符合NSCopying协             议,你就要明确指出这个标记,而不是简单地使用默认值,不然的话,你将获得一个编译警告。这再次向编译器说明你确实须要赋值,即便它是           可拷贝的。

retain
        对其余NSObject和其子类对参数进行release旧值,再retain新值
        指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(缘由很明显,retain会增长对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。

        注意: 把对象添加到数组中时,引用计数将增长对象的引用次数+1。

copy
        对NSString 它指出,在赋值时使用传入值的一份拷贝。拷贝工做由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深刻的讨论,请参考“复制”部分。


copy与retain:

Copy实际上是创建了一个相同的对象,而retain不是:
2.新的对象retain为1 ,旧有对象没有变化retain 到另一个NSString 以后,地址相同(创建一个指针,指针拷贝),内容固然相同,这个对象的retain值+1。
总结:retain 是指针拷贝,copy 是内容拷贝。


assign与retain:

53,#pragma mark -#pragma mark Initialization含义

它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开;注意 #pragma mark – 的“-”后面不能有空格。若是你的标志没有出如今弹出菜单中,好比没有分隔线出现,请在Xcode菜单 “Preferences..”中的 “Code Sense”选项取消选中”Sort listalphabetically”便可。


54,自定义delegate变量声明时使用assign仍是retain?

咱们经过发送消息给对象出发特定动做;对象发送某些变化的时候经过回调函数(callback)通知咱们。对象在特定事件发生的时候,就会调用对应的回调函数,触发业务逻辑。回调函数经过所谓的代理(Delegation)来实现.

delegate使用方法:

@property (assign) <id>xxxDelegate delegate;

  正确的使用方法是使用assign属性而不是retain。之因此对于delegate这类对象使用assign而不是用retain是为了防止循环retain(retain loop)


55,给成员变量(属性)赋值时使不使用self?

使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法。直接调用成员变量而且给其赋值:member=[NSString stringWithFormat:@””];将不执行setmember 方法。

使用self调用成员变量而且给其赋值:self.member=[NSString stringWithFormat:@””];将执行setmember方法。


56,如何给UIbutton 同时设置图片(Image)和文字(Title)以及它们的各类状态?

 

  1.  startRangeButton = [UIButton buttonWithType:UIButtonTypeCustom];  
  2.  startRangeButton.frame = CGRectMake(85,componentOriginY, regionImage.size.width, 16);  
  3. [startRangeButton setBackgroundImage:regionImage forState:UIControlStateNormal];  
  4. //还能够设置其高亮状态startRangeButton setBackgroundImage:regionImage forState:UIControlStateHighlighted];  
  5.  startRangeButton.titleLabel.font = [UIFont systemFontOfSize:7.0];  
  6. [startRangeButton setTitle:@"2013-08-01 07:00" forState:UIControlStateNormal];  
  7. [startRangeButton setTitleColor:COLOR(101, 199, 240, 1) forState:UIControlStateNormal];  
  8. [startRangeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];  

代码中我设置button背景图片为本身定义的一个regionImage,并设置了button的title = “2013-08-01 07:00”【注意,设置了背景图片后,title只能这样添加,以button.titleLabel.text方式添加会没法显示的】,而且设置了tiitle正常和高亮下文字颜色。

 

因此看到这里,应该明白button.setBackgroundImage 和 set Image 的区别了吧,前者是能够同时设置文字,后者是一旦设置了image,没法再显示文字。

普通:高亮:

57,如何将NSDate类型转化为距离1970/1/1的毫秒差?

 

 [formatter setDateFormat:@"yyyy-MM-dd HH:mm"];  这种格式获得的数值是精确到秒的,也就是说少1000,

可是尝试[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];或SS大写,或[formattersetDateFormat:@"yyyy-MM-dd HH:mm.ss.SSS"];都不起做用,最后才发现,原来是这样

NSTimeInterval自己是个秒级别的double类型数值,小数点后面即毫秒数,*1000.0f便可获得毫秒级别的时间差
//为了兼容java版本,事件是从1970/1/1开始
-(NSDate *)getDateTimeFromMilliSeconds:(long long) miliSeconds
{
    NSTimeInterval tempMilli = miliSeconds;
    NSTimeInterval seconds = tempMilli/1000.0;
    NSLog(@"seconds=%f",seconds);
    return [NSDate dateWithTimeIntervalSince1970:seconds];
}

//将NSDate类型的时间转换为NSInteger类型,从1970/1/1开始
-(long long)getDateTimeTOMilliSeconds:(NSDate *)datetime
{
    NSTimeInterval interval = [datetime timeIntervalSince1970];    
    NSLog(@"interval=%f",interval);
    long long totalMilliseconds = interval*1000 ; 
    NSLog(@"totalMilliseconds=%llu",totalMilliseconds);
    return totalMilliseconds;   
}

也就是说,计算结果再本身乘以1000就能够了

 

  1. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
  2. [formatter setDateFormat:@"yyyy-MM-dd HH:mm"];  
  3.   
  4. NSDate *sDate  = [formatter dateFromString:startRangeButton.titleLabel.text];  
  5. NSDate *eDate = [formatter dateFromString:endRangeButton.titleLabel.text];  
  6. NSTimeInterval sinterval =  [sDate timeIntervalSince1970];  
  7. long long start = sinterval*1000;  
  8. NSTimeInterval einterval = [eDate timeIntervalSince1970];  
  9. long long end = einterval*1000;  
  10. [mConnectionHelper doTrack:mobile startTime:start endTime:end];  


58,ios中的全局静态变量

Objective-C 支持全局变量

主要有两种实现方式:

(1)第一种和C/C++中的同样, 使用"extern"关键词;

(2)另一种就是使用单例实现。 

(好比咱们常常会把一个变量放在AppDelegate里面做为全局变量来访问, 其中AppDelegate就是一个单例类) 

在Objective-C中如何实现像C++中那样的静态成员变量呢?
你须要作的是在一个类A的implementation(.m或者.mm)文件中定义一个static变量,而后为A类定义静态成员函数(class method,也就是类方法)来操做该变量。

这样在其它类中你就不须要建立A类的实例来对static变量进行访问。虽然该static变量并非A类的静态成员变量,可是也算达到了一样的效果。static变量的做用域被限制在单一的文件中。

  1. //example.h      
  2. @interface Example : NSObject {     
  3.      
  4. }   
  5. - (id)init;      
  6. +(int)instanceCount;          
  7. @end    

 

  1. //example.m      
  2.  #import "example.h"           
  3. static int count;          
  4. @implementation Example      
  5. -(id)init{      
  6.     self = [super init];      
  7.     if(nil!=self){      
  8.         count+=1;      
  9.     }      
  10.  return self;      
  11. }          
  12. +(int)instanceCount{      
  13.      return count;     
  14. }          
  15. @end    


上面的例子中你就能够经过[Example instanceCount]对静态变量count进行访问,无须建立实例。

警告:  static 写在interface外面编译是没有错误的,可是编译器会报警告,这么说这样的写法是不被编辑器承认的。
错误:static 写在interface里面会直接报错,显然这样的语法是不被承认的。

static关键字声明的变量必须放在implementation外面,或者方法中,若是不为它赋值默认为0,
它只在程序开机初始化一次。

59,如何使用 NSNotificationCenter 在viewcontroller之间进行传值?

简单点的来,两个界面间传值,直接上代码了:

sendViewcontroller.m

 

  1. //SettingViewController :接受值的viewcontroller  
  2. SettingViewController *setting = [[SettingViewController alloc] init];  
  3. [[NSNotificationCenter defaultCenter] addObserver:setting selector:@selector(received:) name:@"msetting" object:nil];  
  4. NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"user",@"type", nil];  
  5.   
  6. [[NSNotificationCenter defaultCenter] postNotificationName:@"msetting" object:dict];  
  7. [self.navigationController pushViewController:setting animated:YES];  
  8.   
  9. [setting release];  

 

SettingViewController.m(接收值的viewcontroller)

 

  1. -(void)received:(NSNotification *)notification{  
  2.   
  3.     id data = [notification object];  
  4.     NSLog(@"received data: %@",data);  
  5. }  

 

这样就实现了基本的使用,跟delegate相似,注意 addObserver时,须要写目标viewcontroller的实例,而不是self。


60,Thread EXC_BAD_ACCESS : objc_retain, objc_getProperty 崩溃错误


如上图所示,遇到这个错误,从字面的意思咱们大体能猜到,是有属性已经被release掉了,可是咱们又使用它了,因此,一部一部排查把,必定有某个地方的属性提早被release掉了,本身手动管理内存就会有这样的困恼,代码不少,不想去找,必定要有耐心,找的过程还能够学到不少知识。


如上图,这个就是我找到的缘由所在,unarchiver release掉了,而咱们在其它的类中想使用location的属性。


61,MAC 终端(bash)svn命令不识别 command not found

在mac os 10.8中,svn Command line tools是没有自动安装的,这样的话,svn 命令行就会失效,解决办法:
1.打开xcode偏好设置(comand+,)-->"Download" -->Components:


2.点击“Command line tools”下载,下载完成以后安装。

3.安装完成以后,打开终端,输入“svn help”,若是出现以下所示,说明命令行工具安装好了。



62,ios MapKit  判断坐标是否在MapView显示范围内

 

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. CLLocationDegrees leftDegrees = mapView.region.center.longitude –(mapView.region.span.longitudeDelta / 2.0);  
  2. CLLocationDegrees rightDegrees = mapView.region.center.longitude +(mapView.region.span.longitudeDelta / 2.0);  
  3. CLLocationDegrees bottomDegrees = mapView.region.center.latitude –(mapView.region.span.latitudeDelta / 2.0);  
  4. CLLocationDegrees topDegrees = self.region.center.latitude +(mapView.region.span.latitudeDelta / 2.0);  
  5. if (leftDegrees > rightDegrees) { // Int'l Date Line in View  
  6. leftDegrees = -180.0 - leftDegrees;  
  7. if (coords.longitude > 0) // coords to West of Date Line  
  8. coords.longitude = -180.0 - coords.longitude;  
  9. }  
  10. If (leftDegrees <= coords.longitude && coords.longitude <= rightDegrees && bottomDegrees <= coords.latitude && coords.latitude <= topDegrees) {  
  11. // 坐标在范围内  
  12. }  


63,简单的冒泡排序法

 

[objc] view plain copy 在CODE上查看代码片 派生到个人代码片
    1. -(void) doDesc{  
    2.   
    3.       
    4.     int list[12] = {12,42,21,45,6,13,89,23,48,74,3,32};  
    5.       
    6.   
    7.     for (int i=0; i<=11; i++) {  
    8.          
    9.           
    10.           
    11.         for (int j=11; j>i; j--) {  
    12.               
    13.             //从大到小  
    14. //            if (list[j]>list[j-1]) {  
    15. //                int temp =list[j];  
    16. //                list[j] = list[j-1];  
    17. //                list[j-1] = temp;  
    18. //                  
    19. //            }  
    20.             //从小到大  
    21.               
    22.             if (list[j]<list[j-1]) {  
    23.                 int temp = list[j-1];  
    24.                 list[j-1] = list[j];  
    25.                 list[j] = temp;  
    26.             }  
    27.               
    28.         }  
    29.    
    30.     }  
    31.       
    32.     for (int k =0 ; k<12; k++) {  
    33.         NSLog(@"%d == %d",k,list[k]);  
    34.   
    35.     }  
    36.       
    37.       
    38. }