IOS开发小技巧

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

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

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



2,NSDate:ios


[java]  view plain copy
 
  1. 字母  日期或时间元素    表示     示例       
  2.         
  3.        
  4.        
  5.        
  6.        
  7.        
  8.        
  9. -)     Number              
  10. -)      Number            
  11. -)     Number           
  12. -)     Number           
  13.        
  14.        
  15.        
  16. :       
  17.    time   zone     -       


 


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


举例:正则表达式

 

[java]  view plain copy
 
  1. //建立一个时间对象   
  2.   
  3. **)];  
  4.   
  5.    
  6.   
  7. ];   
  8.   
  9.   
  10. ];  
  11.   
  12.   
  13.   
  14.   
  15.   
  16. ,datestring2);  

 


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



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

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

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


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



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

简单点说,就是当字典,数组为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使用正则表达式。(在TextField中)

 

[java]  view plain copy
 
  1. NSString *regex =[NSString stringWithFormat:@];  
  2. BOOL isMatch = [predicate evaluateWithObject:editPhoneField.text];  


 

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

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

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

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

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

而后打开添加代码:

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


11更改Xcode的缺省公司名

        

[java]  view plain copy
 
  1. //  testAppDelegate.m   //  test   //   //  Created by gaohf on 11-5-24.   //  Copyright 2011 __MyCompanyName__. All rights reserved.  

        在终端中执行如下命令:

 

        

[java]  view plain copy
 
  1. defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions    

         

[java]  view plain copy
 
  1. //   //  testAppDelegate.m   //  test   //   //  Created by gaohf on 11-5-24.   //  Copyright 2011 COMPANY. All rights reserved.   //    




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

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

[java]  view plain copy
 
  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
 
  1. UIColor *itemcolor = [UIColor colorWithRed:.0f/.0f green:.0f/.0f blue:.0f/.0f alpha:.3f];  
  2. self.navigationController.navigationBar.tintColor = itemcolor;  


//设置自定义的图片:

 

 

[java]  view plain copy
 
  1. [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@] 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
 
  1. [leftNaviView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@]]];  


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

 

 

[java]  view plain copy
 
  1. [leftNaviView setFrame:CGRectMake()];  

 


效果图:




16如何在项目用代码打开AppStore软件(也就是访问appstore)


[java]  view plain copy
 
  1.           
  2. //        int m_appleID = 576337094; //        NSString *str = [NSString stringWithFormat: //                                 @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d", //                                 m_appleID ];   
  3.         [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];  

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

 


17,如何代码实现点击http://www.kaka.com或400-800-400或message实现跳转safari,phone或message?

只须要在相应的代码中写入:

1、调用 电话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
 
  1. 调用sendSMS函数  
  2. //内容,收件人列表 void if // 处理发送完的响应结果 void if elseif else import //发送邮件 void if //邮件完成处理 void if elseif else 默认发送短信的界面为英文的,解决办法为:在.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
 
  1. 应用程序的名称和版本号等信息都保存在mainBundle的infoDictionary字典中,用下面代码能够取出来。  
  2. ];  
  3. ];  
  4. ,appName,versionNum];  


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

 



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


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

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

 

[java]  view plain copy
 
  1. [[UIApplication sharedApplication] setIdleTimerDisabled:YES];  


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

 


22,一直以来的疑问:在Xcode中,有时候在类名称后边带有M或C等标示,不知道为什么意。以下图所示:


 表示在版本控制中,自上一次提交以来,文件作了修改。貌似只有在带有版本控制的项目代码中才会显示。



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


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

 

UIInterfaceOrientationLandscapeLeft

UIInterfaceOrientationLandscapeRight

UIInterfaceOrientationPortrait

UIInterfaceOrientationPortraitUpsideDown

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

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

具体见下图:



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

 

[java]  view plain copy
 
  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  2.   
  3.   
  4. return }  

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

 


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

 

[java]  view plain copy
 
  1. -(void   
  2. if ,,);  
  3.   
  4. else//== else if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) ,);  
  5. }  

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


【注意,以上两个方法,在最新的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
 
  1. -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{  
  2. int;  
  3.   
  4. 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

 

[cpp]  view plain copy
 
  1. UINib *nib = [UINib nibWithNibName:@ 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];


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

 

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

 

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

 

[cpp]  view plain copy
 
  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方法中加入如下代码:

 

[cpp]  view plain copy
 
  1. UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];  
  2. ;  
  3.   

因此,经过这个咱们能够明白,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,图片模糊化处理

 

[cpp]  view plain copy
 
  1. +(UIImage *)scale:(UIImage *)image toSize:(CGSize)size  
  2. return }  



 

35,NSString转换大小写的用法

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

[cpp]  view plain copy
 
  1. NSString *str = @ // Convert string to uppercase "upperStr: %@" // Convert string to caps "capStr: %@" // Convert string to lowercase "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 参考


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

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


37,判断iphone5屏幕的宏定义

 

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

 

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

 

[cpp]  view plain copy
 
  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



3八、invalid deployment target for -stdlib=libc++ (requires iOS 5.0 or later)错误


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



39,如何调用系统声音?【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


40,重复调用2次loadView和viewDidLoad

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

 

[cpp]  view plain copy
 
  1. 错误代码:  
[cpp]  view plain copy
 
  1. - (void );  
  2.   
  3.   
  4. void );  
  5.   }  


打印信息:

 

 

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方法。


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

 

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

imageView.userInteractionEnabled = YES;

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

 

42,如何启动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; 
 
 
 

 

42,使用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的值是一串很长的字符串。


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

 

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

searchField.enablesReturnKeyAutomatically = YES;


4四、判断是否是iPhone5

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


用时候直接 if (iPhone5) ooxx