你的位置:首页 > 软件开发 > 操作系统 > iOS项目开发中的知识点与问题收集整理(Part 一)

iOS项目开发中的知识点与问题收集整理(Part 一)

发布时间:2016-04-24 00:00:11
前言部分注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045文中有些方法可能已过时并不适用于现在的开发环境。 1、Search Bar 怎样去掉背景的颜色(storyboard里只 ...

iOS项目开发中的知识点与问题收集整理(Part 一)

前言部分

注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045

文中有些方法可能已过时并不适用于现在的开发环境。

 

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

[self PerformSegueWithIdentifier:@"targetViewController",self]; 就可以了,可是我想实例化想要跳转的控制器,然后设置某一属性的值,这样跳转后控制器获取那个属性,就会得到值了,可是这样做会有一个问题: if(str == nil)就可以了。如下图所示:而控制台打印:str =  <null>,代表着这是一个空字符串,赋值为空,指针是存在的,只是内容为空,这种判断需要使用:if(str is equal [NSNull null ]) ,因为在ios上,内容为空不能简单的判断str==null(null 在ios上得用[NSNull null])2,为了国际化而言,我们最好创建一个chinese专有的infoPlist.strings文件。如上图所示,添加一个中文的plist然后打开添加代码:

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

在项目中添加如下代码: 效果图:

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

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 7 //以下是通过appstore链接到自己应用在商店的位置 8 NSString *url = [NSString stringWithFormat:@"http://itunes.apple.com/cn/app/huo-xing-she-xin-dian/id549425594?l=en&mt=8"]; 9     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]]; 
若需要传递内容可以做如下操作:

 1 //加入:MessageUI.framework 2 #import <MessageUI/MFMessageComposeViewController.h> 3  4 //实现代理:MFMessageComposeViewControllerDelegate 5  6 //调用sendSMS函数  7 //内容,收件人列表  8 - (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients  9 {  11   MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];  13   if([MFMessageComposeViewController canSendText])  15   {  17     controller.body = bodyOfMessage;  19     controller.recipients = recipients;  21     controller.messageComposeDelegate = self;  23     [self presentModalViewController:controller animated:YES]; 25   }   27 } 28  29 // 处理发送完的响应结果 30 - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result 31 { 32  [self dismissModalViewControllerAnimated:YES];  34  if (result == MessageComposeResultCancelled) 35   NSLog(@"Message cancelled") 36  else if (result == MessageComposeResultSent) 37   NSLog(@"Message sent")  38  else  39   NSLog(@"Message failed")  40 } 
UIInterfaceOrientationLandscapeLeftUIInterfaceOrientationLandscapeRightUIInterfaceOrientationPortraitUIInterfaceOrientationPortraitUpsideDown前两个是横屏时的状态,后两个是正常状态(Portrait)和上下颠倒(UpsideDown)时的状态。【注意:Left和Right两个左右模拟器旋转时移动的方向正好是相反的,但移动后Home的方向,就如下图所示】具体见下图:其中涉及到两个方法,在ViewController中默认会实现这个方法:

1 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 2 { 3   //除了不允许旋转屏幕后:上下颠倒,其余方向都运行旋转 4   //如果想都运行,可以直接返回YES,或都不允许NO 5   return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 6    7 } 
第二个方法,是我们比较常用的,也就是在设备即将以某个方向旋转之前,我们在其状态(方向)设置组件或view的Frame,bound,等需要改变的属性时所用到的方法。

 1 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{  2   //屏幕旋转到横屏时  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 } 
http://blog.csdn.net/zzfsuiye/article/details/8251060  IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)首先通过:NSLog(@"subviews:%@",self.view.subviews); 这个我们可以看到当前下所有的subview(NSArray类型)如下图所示:我们现在要做的就是把后两者对调一下,所以在self.view 中寻找一下看有没有replace相关的方法 [self.viewexchangeSubviewAtIndex:1 withSubviewAtIndex:2];因为通过log打印,我们已经知道Mapview在第一个下标的位置,view1在第二个下标的位置。大功告成。记住这个方法:self.view exchangeSubviewAtIndex:withSubviewAtIndex:];  

 

26、如何隐藏UINavigationBar  

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

 1 //隐藏NavigationBar 2 -(void) viewWillAppear:(BOOL)animated{ 3 [self.navigationControllersetNavigationBarHidden:YES animated:YES]; //设置隐藏 4  5  [super viewWillAppear:animated]; 6 } 7  8 -(void) viewWillDisappear:(BOOL)animated{ 9  [self.navigationControllersetNavigationBarHidden:NO animated:YES];10 11  [super viewWillDisappear:animated];12 } 
  string:    替换字符串; string.length为0时,表示删除。  

 

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

1 UINib *nib = [UINib nibWithNibName:@"TvWeiboCell" bundle:nil]; 2 [tableView registerNib:nib forCellReuseIdentifier:CellIdentifier];  
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 中的方法: 如上图所示,回退到界面2,很简单:  [self.navigationControllerpopViewControllerAnimated:YES];  直接就回退到界面2了,可是我们既不想回到rootviewcontroller,

也不想回到界面2,只想回到界面1,该如何做? 【注意】千万不要在这个地方实例化 界面1 然后popToViewController,这种方法是不对的。  

 

32、self.navigationItem.backBarButtonItem 的title设置   

新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一级页面的title较长,在进入第二级页面后返回按钮leftButtonItem的title就会变得很长,

对NavigationBar空间占用很大,而且不美观,于是使用代码对leftButtonItem的title文本进行修改,无论是设置self.navigationItem.leftBarButtonItem.title = @"返回";还是self.navigationItem.backBarButtonItem.title = @"返回";都没有效果,title文本始终不会发生变化。到网上乱搜一通后,得到了以下解决方法,相对来说比较简单,特记录如下:一般一个程序中有一个UIWindow,一个UINavigationController,一个根UIViewController,多个子UIViewController。UIWindow是整个可视界面的容器,里面放置我们看到的UIView。一个UIViewController中有一个顶部的UINavigationBar、一个根UIView,多个子UIView。UINavigationController是用于构建分层应用程序的主要工具,它维护了一个UIViewController栈。UINavigationItem表示UINavigationBar中的控件,比如左按钮、中间标题、右按钮。---------------------------------------------------------------------------------------------------------  

 

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

/**********************************************/self.navigationItemself.navigationController.navigationItemself.navigationController.navigationBar/**********************************************/1,  不要混淆 self.navigationItem  和 self.navigationController.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即可。最后在需要播放提示音的地方编写如下代码:AudioServicesPlaySystemSound(1000);//新邮件消息提示AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震动注:括号中为系统声音的id,详见请参考以下网址http://iphonedevwiki.net/index.php/AudioServices。

40、重复调用2次loadView和viewDidLoad   

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

//错误代码 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  }  
虽然运行效果是对的,但是系统连续调用了2次loadView和viewDidLoad方法,导致创建了2次UIView,造成了不必要的开销。原因分析:

原标题:iOS项目开发中的知识点与问题收集整理(Part 一)

关键词:IOS

IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。