7,隐藏键盘的两种方法
29,iOS和iPad各app图标和启动页尺寸php
其实在代码里仍是能够设置的,那就是删除背景viewhtml
[[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];java
[注意]在开发中,若是使用年月日,用NSDateFormatter setFormat :@"yyyy-MM-dd",若是是使用小时和分钟,设置为:"HH:mm",切记不要设置“HH-mm”,这样会出错的。ios
举例:c++
若是使用 UTTabviewCell,设置其accessory样式为:Detail Disclosure ,就是在每个cell右边设置一个detail button。若是这样的操做是使用storyboard,进行的,它会要求你给每个你cell设置indentifier,而后你会在如下方法内设置重用indentfier,别忘记加上一句话,不然编译运行时可能会弹出: cell未实例化git
在开发项目中,有时有这样的需求:运行程序,登录界面是一个自由的ViewController,只是摆放几个TextField和button,点击后跳转到其它选择界面,点击选项后进入咱们的主界面:这个时候,在登录界面做跳转时,会有好多的方法,若是使用storyboard,就比较方便了,设置一个segue,跳转代码中正则表达式
[self PerformSegueWithIdentifier:@"targetViewController",self]; 就能够了,但是我想实例化想要跳转的控制器,而后设置某一属性的值,这样跳转后控制器获取那个属性,就会获得值了,但是这样作会有一个问题:算法
主界面控制器若是使用了navigatorViewController,而且是其RootViewController,等到在主界面设置功能,点击某一功能,想push到一个新页面时,问题就来了,你会发现毫无反应,没有报错,只是segue没法跳转。后来终于找到缘由:就是我在登录控制器跳转时没有使用segue的方法,而是用代码self.storyboard,加载一个新类,具体原理目前尚未搞明白,先把出问题的代码记录下来,回头补之:编程
代码这样作,会致使其后没法使用navigatorViewController作push跳转json
开发过程当中,咱们经过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值,返回@"",好作判断
只需在加载时,添加这样的话就能够了:
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。
只须要在TextField属性中的Secure(安全的)勾选上就能够了。显示apple默认的密文显示方式。
1,在项目的Supporting Files下寻找infoPlist.strings文件,打开后会看到一片空白(英文默认是跟随项目名称显示)。此时,能够就地添加一句代码:CFBundleDisplayName="爱贝通";
这样的话,不管手机设置英文语言仍是中文语言,应用程序都会显示设置的名称。
2,为了国际化而言,咱们最好建立一个chinese专有的infoPlist.strings文件。
如上图所示,添加一个中文的plist
而后打开添加代码:
这个时候,大功告成。部署在模拟器或真机中吧,你的手机设置(中/英)文语言,它就会调用相应的配置文件。
在终端中执行如下命令:
只须要在要添加view时侯这样写:
这样,直接把waitingview添加到了uiWindow上,而不是self.view上。再次运行,会发现屏幕所有区域都已经遮挡住了。
这是因为,操做不当,获取点击了例如 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的第一个界面:
在项目中添加以下代码:
//设置背景颜色:
//设置自定义的图片:
5.0以上,api有了上面setBackgroundImage的方法,能够直接设置,若是项目须要适配5.0如下版本的设备,最好加一个判读,是否有此函数,有则设置,没有就经过drawRect方法设置。
另外:设置背景图片没法匹配backButton或rightButtonItem,因此返回按钮或右边自定义的Bar button Item须要自行处理。
在storyboard或xib中,添加一个uiview,属性设置栏通常都有设置背景颜色,样式,透明度alpha,可是没有提供设置image,只有在imageview中才有,因此,要想设置背景图片,只能在代码中设置,以下:
这样,背景就能够变成想要的图片了。另外,设置大小:
效果图:
把以上代码直接拷贝到想要实现点击跳转的操做方法内就能够了,经过appID,随意能够经过appstore打开应用,直接用url就能够连接到了。很简单,通常都用在检查更新的时候。
在相应的代码中写入:
一、调用 电话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
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
-(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];
}
此version 为工程info下的Bundle version字段值:value能够随意定义。
CFBundleVersion,标识(发布或未发布)的内部版本号。这是一个单调增长的字符串,包括一个或多个时期分隔的整数。
CFBundleShortVersionString 标识应用程序的发布版本号。该版本的版本号是三个时期分隔的整数组成的字符串。第一个整数表明重大修改的版本,如实现新的功能或重大变化的修订。第二个整数表示的修订,实现较突出的特色。第三个整数表明维护版本。该键的值不一样于“CFBundleVersion”标识。
图片里的 Version 对应的就是CFBundleShortVersionString (发布版本号 如当前上架版本为1.1.0 以后你更新的时候能够改成1.1.1)
Build 对应的是 CFBundleVersion(内部标示,用以记录开发版本的,每次更新的时候都须要比上一次高 如:当前版本是11 下一次就要大于11 好比 12,13 ....10000)
好比,若是咱们作一个播放视频的功能时,想在播放的时候,不会自动进入屏保(黑屏)
只要在代码里加入这一行:
固然,在想要黑屏的时候还须要把它设置为NO(好比视频播放完毕时),否则屏幕会在此软件运行下一直亮着。
表示在版本控制中,自上一次提交以来,文件作了修改。貌似只有在带有版本控制的项目代码中才会显示,也就是说你的项目使用了SVN、GIT等工具后,会在Xcode中识别出来。
'A' 新增
'D' 删除
'M' 修改
'R' 替代
'C' 冲突
'I' 忽略
'?' 未受控
'!' 丢失,通常是将受控文件直接删除致使
屏幕旋转一共有4个相关属性(旋转方向):
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
前两个是横屏时的状态,后两个是正常状态(Portrait)和上下颠倒(UpsideDown)时的状态。
【注意:Left和Right两个左右模拟器旋转时移动的方向正好是相反的,但移动后Home的方向,就以下图所示】
具体见下图:
其中涉及到两个方法,在ViewController中默认会实现这个方法:
这个方法是声明此ViewController所运行屏幕旋转的方向,一共4种类型,所有容许返回YES,上图所示除了不容许上下颠倒,其他均可以。【注意,项目设置Supported Device Orientations 所支持的屏幕旋转类型并不影响此方法的设置,也就是说,哪怕Support只支持Portrait,方法里设置UpsideDown,此ViewController也会实现上下颠倒旋转的】
第二个方法,是咱们比较经常使用的,也就是在设备即将以某个方向旋转以前,咱们在其状态(方向)设置组件或view的Frame,bound,等须要改变的属性时所用到的方法。
全部旋转屏幕后须要改变组件尺寸属性的设置均可以在这个方法里面实现。
【注意,以上两个方法,在最新的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(三)屏幕的旋转和大小设置;
以上为参考教程
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,再运行。
情景再现:
咱们在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:];
有的时候,咱们的视图使用了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];
}
一、实现UITextFieldDelegate协议;
二、实现textField:shouldChangeCharactersInRange:replacementString:方法;
如上代码,若是咱们简单的这样写: 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时,表示删除。
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
NSString 中的方法:
NSStringFromCGPoint
NSStringFromCGSize
NSStringFromCGRect
NSStringFromCGAffineTransform
NSStringFromUIEdgeInsets
如:NSLog(@"rect1: %@", NSStringFromCGRect(rect1));
如上图所示,回退到界面2,很简单: [self.navigationControllerpopViewControllerAnimated:YES]; 直接就回退到界面2了,但是咱们既不想回到rootviewcontroller,也不想回到界面2,只想回到界面1,该如何作?
笨方法:在界面1要跳转到界面2时,把本身self,set到界面2(前提界面2要设置一个id类型的属性,用来存放界面1self,以此类推,当在界面3想退到界面1时,
[self.navigationControllerpopToViewController:controlleranimated:YES];
其实如今刚明白,一个很简单的方法:
想起来navigation的机制了吧,每当咱们push到一个viewcontroller时,就会把这个viewcontroller的实例保存到nsarray里,经过array能够获取到任何一个viewcontroller,这不就解决问题了么?
【注意】千万不要在这个地方实例化 界面1 而后popToViewController,这种方法是不对的。
新写的App中须要使用UINavigationController对各个页面进行导航,但因为第一级页面的title较长,在进入第二级页面后返回按钮leftButtonItem的title就会变得很长,对NavigationBar空间占用很大,并且不美观,因而使用代码对leftButtonItem的title文本进行修改,不管是设置self.navigationItem.leftBarButtonItem.title = @"返回";仍是self.navigationItem.backBarButtonItem.title = @"返回";都没有效果,title文本始终不会发生变化。到网上乱搜一通后,获得了如下解决方法,相对来讲比较简单,特记录以下:
在第一级页面的viewDidLoad方法中加入如下代码:
因此,经过这个咱们能够明白,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。
UINavigationBar中有一个UINavigationItem,UINavigationItem。
UINavigationController是用于构建分层应用程序的主要工具,它维护了一个UIViewController栈。
这个栈中必须有一个根UIViewController,其余的UIViewController都是子UIViewController。
UINavigationItem表示UINavigationBar中的控件,好比左按钮、中间标题、右按钮。
UINavigationController会自动在当前子UIViewController的UINavigationBar左边添加一个返回按钮。
按钮名称是上一个UIViewController的标题。
---------------------------------------------------------------------------------------------------------
/**********************************************/
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便可。
此时,若是须要,就得本身画导航过程当中的返回按钮了。
iOS 6中NSString对象有些新的使用方法,可让字符串转变成所有大写,所有小写,或者每一个单词首字母大写。
代码以下所示:
运行结果:
经过使用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 参考
虽然更改了新demo的bundle identifier和以前的identifier同样,可是真机上还保留着以前调试时的demo,因此新的工程若是使用一样的identifier真机调试,须要先把机器上原来的demo删除,再使用新工程调试。
在须要判断屏幕尺寸的地方:
iphone5的View为568,减去Nav(44)+任务栏(20),为504,相比iphone4s及之前版本的480,减去Nav+任务栏,为416,高出88(差异).
http://www.cnblogs.com/maxfong/archive/2012/10/04/2711379.html
选中项目--target---build settings 找到C++Standard Library 改为:Compiler Default,再编译就不会有错误了.
首先要在工程里加入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
最好不要在UIViewController的loadView方法中改变状态栏的可视性(好比状态栏由显示变为隐藏、或者由隐藏变为显示),由于会致使重复调用2次loadView和viewDidLoad方法。
打印信息:
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方法。
若是在UIImageView中添加了一个按钮,你会发如今默认状况下这个按钮是没法被点击的,须要设置UIImageView的userInteractionEnabled为YES:
imageView.userInteractionEnabled = YES;
设置为YES后,UIImageView内部的按钮就能够被点击了
大部分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;
假如个人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的值是一串很长的字符串。
TextField设置这个属性为YES就能够了,默认为NO
searchField.enablesReturnKeyAutomatically =YES;
实际上是一个小气泡png,而后拉伸中间部分,四个角不拉动,就是局部拉伸。ios自带方法,四个角能够不拉伸的,以下:
首先要实现TextField的delegate,在方法:
这说明当开始输入时,tableview在原来的基础上向上抬起70个距离。多个UITextFiled能够经过判断来使用CGPoint的调整高度,我这写的是70.
tableview的scrollEnabled属性必定要是YES;要否则滚动不了了。
记得在return时复原tableview的位置:
咱们给本身的工程添加一个通用的断点:
一步步按上面图完成操做。
再运行程序
自动就断点到这里来了,
log信息是:
这样很简单就能发现程序崩溃是由于value没有 isEqualToString方法。若是没加上面这个通用的断点,那程序会直接断点到main函数去。
从UImageView上找ContentMode或clipToBounds是都无论用的,正确的办法是,不用UImageView,使用UIView,而后设置backgroundColor属性为咱们的图片,这样的话自动会以屏幕的方式显示。
下图所示:(原图是一个6X6的方格)
在开发时,想要在tableview中的某一个Cell设置选中状态,而且Cell的背景颜色是一个自定义颜色。
这样的话,第1行cell就应该是咱们设置好的颜色,不过请注意,此方法在UITableViewStylePlain的风格下有效,在 UITableViewStyleGrouped的样式下是无效的!这个跟tableview的backgroundView和backgroundColor是没有关系的,我的猜测应该是在Grouped风格下,cell选中的颜色有系统的view遮罩,致使咱们设置的没法显示出来。
【补充】若是想在reload或init时设置tableview的某一cell为 selected状态,千万不要使用cell setSelected:YES animated:YES,使用tableview的方法:
使用系统或简单自定义的UITableViewCell时,当选中某一行Cell后,除了背景颜色改变外,Cell上全部的组件(数据)好比UILabel,UIbutton等都被自动显示成了其
Highlighted(高亮)状态下的效果,(若是想显示出效果,你的那些自定义的组件必需要设置高亮状态,好比highlightedTextColor,UIControlStateHighlighted等),因此这一点须要特别注意,若是不想要系统的这个自动特效,有两个解决办法:
1,组件不设置highlighted下的属性
2,若是自定义的Cell:
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操做。
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不是:
1.好比一个NSString 对象,地址为0×1111 ,内容为@”STR”,Copy 到另一个NSString 以后,地址为0×2222 ,内容相同。
2.新的对象retain为1 ,旧有对象没有变化retain 到另一个NSString 以后,地址相同(创建一个指针,指针拷贝),内容固然相同,这个对象的retain值+1。
总结:retain 是指针拷贝,copy 是内容拷贝。
assign与retain:
1. 接触过C,那么假设你用malloc分配了一块内存,而且把它的地址赋值给了指针a,后来你但愿指针b也共享这块内存,因而你又把a赋值给(assign)了b。此时a和b指向同一块内存,请问当a再也不须要这块内存,可否直接释放它?答案是否认的,由于a并不知道b是否还在使用这块内存,若是a释放了,那么b在使用这块内存的时候会引发程序crash掉。
2. 了解到1中assign的问题,那么如何解决?最简单的一个方法就是使用引用计数(reference counting),仍是上面的那个例子,咱们给那块内存设一个引用计数,当内存被分配而且赋值给a时,引用计数是1。当把a赋值给b时引用计数增长到2。这时若是a再也不使用这块内存,它只须要把引用计数减1,代表本身再也不拥有这块内存。b再也不使用这块内存时也把引用计数减1。当引用计数变为0的时候,表明该内存再也不被任何指针所引用,系统能够把它直接释放掉。
总结:上面两点其实就是assign和retain的区别,assign就是直接赋值,从而可能引发1中的问题,当数据为int, float等原生类型时,可使用assign。retain就如2中所述,使用了引用计数,retain引发引用计数加1, release引发引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。
它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开;注意 #pragma mark – 的“-”后面不能有空格。若是你的标志没有出如今弹出菜单中,好比没有分隔线出现,请在Xcode菜单 “Preferences..”中的 “Code Sense”选项取消选中”Sort listalphabetically”便可。
咱们经过发送消息给对象出发特定动做;对象发送某些变化的时候经过回调函数(callback)通知咱们。对象在特定事件发生的时候,就会调用对应的回调函数,触发业务逻辑。回调函数经过所谓的代理(Delegation)来实现.
delegate使用方法:
@property (assign) <id>xxxDelegate delegate;
正确的使用方法是使用assign属性而不是retain。之因此对于delegate这类对象使用assign而不是用retain是为了防止循环retain(retain loop)
使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法。直接调用成员变量而且给其赋值:member=[NSString stringWithFormat:@””];将不执行setmember 方法。
使用self调用成员变量而且给其赋值:self.member=[NSString stringWithFormat:@””];将执行setmember方法。
代码中我设置button背景图片为本身定义的一个regionImage,并设置了button的title = “2013-08-01 07:00”【注意,设置了背景图片后,title只能这样添加,以button.titleLabel.text方式添加会没法显示的】,而且设置了tiitle正常和高亮下文字颜色。
因此看到这里,应该明白button.setBackgroundImage 和 set Image 的区别了吧,前者是能够同时设置文字,后者是一旦设置了image,没法再显示文字。
普通:高亮:
[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就能够了
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变量的做用域被限制在单一的文件中。
上面的例子中你就能够经过[Example instanceCount]对静态变量count进行访问,无须建立实例。
警告: static 写在interface外面编译是没有错误的,可是编译器会报警告,这么说这样的写法是不被编辑器承认的。
错误:static 写在interface里面会直接报错,显然这样的语法是不被承认的。
static关键字声明的变量必须放在implementation外面,或者方法中,若是不为它赋值默认为0,
它只在程序开机初始化一次。
简单点的来,两个界面间传值,直接上代码了:
sendViewcontroller.m
SettingViewController.m(接收值的viewcontroller)
这样就实现了基本的使用,跟delegate相似,注意 addObserver时,须要写目标viewcontroller的实例,而不是self。
如上图所示,遇到这个错误,从字面的意思咱们大体能猜到,是有属性已经被release掉了,可是咱们又使用它了,因此,一部一部排查把,必定有某个地方的属性提早被release掉了,本身手动管理内存就会有这样的困恼,代码不少,不想去找,必定要有耐心,找的过程还能够学到不少知识。
如上图,这个就是我找到的缘由所在,unarchiver release掉了,而咱们在其它的类中想使用location的属性。
在mac os 10.8中,svn Command line tools是没有自动安装的,这样的话,svn 命令行就会失效,解决办法:
1.打开xcode偏好设置(comand+,)-->"Download" -->Components:
2.点击“Command line tools”下载,下载完成以后安装。
3.安装完成以后,打开终端,输入“svn help”,若是出现以下所示,说明命令行工具安装好了。