ios開發(fā)一點(diǎn)tip

1,Search Bar 怎樣去掉背景的顏色(storyboard里只能設(shè)置background顏色撬码,可是發(fā)現(xiàn)clear Color無法使用)
其實(shí)在代碼里還是可以設(shè)置的购笆,那就是刪除背景view
[[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];

2,NSDate使用
[java] view plain copy

派生到我的代碼片
派生到我的代碼片

字母 日期或時(shí)間元素 表示 示例
G Era 標(biāo)志符 Text AD
y 年 Year 1996 96
M 年中的月份 Month July; Jul; 07
w 年中的周數(shù) Number 27
W 月份中的周數(shù) Number 2
D 年中的天數(shù) Number 189
d 月份中的天數(shù) Number 10
F 月份中的星期 Number 2
E 星期中的天數(shù) Text Tuesday; Tue
a Am/pm 標(biāo)記 Text PM
H 一天中的小時(shí)數(shù)(0-23) Number 0
k 一天中的小時(shí)數(shù)(1-24) Number 24
K am/pm 中的小時(shí)數(shù)(0-11) Number 0
h am/pm 中的小時(shí)數(shù)(1-12) Number 12
m 小時(shí)中的分鐘數(shù) Number 30
s 分鐘中的秒數(shù) Number 55
S 毫秒數(shù) Number 978
z 時(shí)區(qū) General time zone Pacific Standard Time; PST; GMT-08:00
Z 時(shí)區(qū) RFC 822 time zone -0800

[注意]在開發(fā)中,如果使用年月日矫渔,用NSDateFormatter setFormat :@"yyyy-MM-dd"崔列,如果是使用小時(shí)和分鐘,設(shè)置為:"HH:mm"屁桑,切記不要設(shè)置“HH-mm”医寿,這樣會(huì)出錯(cuò)的。

舉例:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

//創(chuàng)建一個(gè)時(shí)間對象
NSData * date = [NSDate date];
//打印時(shí)間
NSLog(@"today is %@",date);

//再獲取的時(shí)間date減去24小時(shí)的時(shí)間(昨天的這個(gè)時(shí)候)  
NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(24*60*60)];  
NSLog(@"yesterday is %@",yesterday);//打印昨天的時(shí)間  
  
/*字符串換成時(shí)間*/   
//設(shè)置一個(gè)字符串的時(shí)間  
NSString *datestring = [NSString stringWithFormat:@"1999-09-03"];   
//想要設(shè)置自己想要的格式蘑斧,可以用nsdateformatter這個(gè)類靖秩,這里是初始化  
NSDateFormatter * dm = [[NSDateFormatter alloc]init];   
//指定輸出的格式   這里格式必須是和上面定義字符串的格式相同,否則輸出空  
[dm setDateFormat:@"yyyy-MM-dd"];  
//把字符串的時(shí)間轉(zhuǎn)換成Date對象竖瘾,用dateFromString方法  
NSDate * newdate = [dm dateFromString:datestring];  
//輸出  
NSLog(@"newdate is %@",newdate);  
  
  
/*把時(shí)間轉(zhuǎn)換成字符串*/  
//把Date對象轉(zhuǎn)換成String對象  用stringFromDate方法  
NSString * datestring2 = [dm stringFromDate:newdate];  
//打印  
NSLog(@"datestring2 is %@",datestring2);  

3,UTTabviewCell 未實(shí)例化
如果使用 UTTabviewCell沟突,設(shè)置其accessory樣式為:Detail Disclosure ,就是在每一個(gè)cell右邊設(shè)置一個(gè)detail button捕传。如果這樣的操作是使用storyboard惠拭,進(jìn)行的,它會(huì)要求你給每一個(gè)你cell設(shè)置indentifier庸论,然后你會(huì)在以下方法內(nèi)設(shè)置重用indentfier职辅,別忘記加上一句話,否則編譯運(yùn)行時(shí)可能會(huì)彈出: cell未實(shí)例化


4,StoryBoard中segue的使用
在開發(fā)項(xiàng)目中葡公,有時(shí)有這樣的需求:運(yùn)行程序罐农,登陸界面是一個(gè)自由的ViewController,只是擺放幾個(gè)TextField和button,點(diǎn)擊后跳轉(zhuǎn)到其它選擇界面催什,點(diǎn)擊選項(xiàng)后進(jìn)入我們的主界面:這個(gè)時(shí)候涵亏,在登陸界面作跳轉(zhuǎn)時(shí),會(huì)有好多的方法蒲凶,如果使用storyboard气筋,就比較方便了,設(shè)置一個(gè)segue,跳轉(zhuǎn)代碼中
[self PerformSegueWithIdentifier:@"targetViewController",self]; 就可以了旋圆,可是我想實(shí)例化想要跳轉(zhuǎn)的控制器宠默,然后設(shè)置某一屬性的值,這樣跳轉(zhuǎn)后控制器獲取那個(gè)屬性灵巧,就會(huì)得到值了搀矫,可是這樣做會(huì)有一個(gè)問題:
主界面控制器如果使用了navigatorViewController,并且是其RootViewController,等到在主界面設(shè)置功能刻肄,點(diǎn)擊某一功能瓤球,想push到一個(gè)新頁面時(shí),問題就來了敏弃,你會(huì)發(fā)現(xiàn)毫無反應(yīng)卦羡,沒有報(bào)錯(cuò),只是segue無法跳轉(zhuǎn)。后來終于找到原因:就是我在登陸控制器跳轉(zhuǎn)時(shí)沒有使用segue的方法绿饵,而是用代碼self.storyboard欠肾,加載一個(gè)新類,具體原理目前還沒有搞明白拟赊,先把出問題的代碼記錄下來刺桃,回頭補(bǔ)之:



代碼這樣做,會(huì)導(dǎo)致其后無法使用navigatorViewController做push跳轉(zhuǎn)

5,nil和Nil和NULL的判斷
開發(fā)過程中要门,我們通過http請求虏肾,后臺(tái)返回json數(shù)據(jù),而有時(shí)數(shù)據(jù)里某一字段的值為null~欢搜,然后我們把此值賦值給NSArray,NSdictionary,或是NSString,然后我們會(huì)判斷此值為null時(shí)谴轮,所做的處理炒瘟,而通常慣性思維判斷時(shí)我們都會(huì)寫:if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil),我們發(fā)現(xiàn)第步,都不好用疮装,根本沒有起到判斷的作用~后來我才發(fā)現(xiàn),原來不能這樣來判斷粘都。
簡單點(diǎn)說廓推,就是當(dāng)字典,數(shù)組為null時(shí)翩隧,后臺(tái)打印的輸出結(jié)果是這樣:



然后樊展,我們需要在代碼判斷時(shí)利用[NSNull null]來判斷,具體如:



isEqual:[NSNull null] 就搞定了堆生,nsarray也是同樣的道理专缠。

控制臺(tái)打印:str=(null) 代表著 字符串或數(shù)組或字典是一個(gè)空指針淑仆,(而非空字符串)判斷的時(shí)候涝婉,直接用:
if(str == nil)就可以了。如下圖所示:


而控制臺(tái)打诱岬 :str = <null>墩弯,代表著這是一個(gè)空字符串,賦值為空寞射,指針是存在的渔工,只是內(nèi)容為空,這種判斷需要使用:
if(str is equal [NSNull null ]) 怠惶,因?yàn)樵趇os上涨缚,內(nèi)容為空不能簡單的判斷str==null(null 在ios上得用[NSNull null])



一般這種情況是,服務(wù)器那邊是null,直接返回@"null"的字符串脓魏,這樣在ios這邊不好判斷兰吟,最好跟后臺(tái)溝通,如果遇到null值茂翔,返回@""混蔼,好做判斷

6,給uiview設(shè)置圓角樣式
只需在加載時(shí),添加這樣的話就可以了:
testView.layer.cornerRadius = 6; testView.layer.masksToBounds = YES;
注意珊燎,需要 import <QuartzCore/QuartzCore.h> 導(dǎo)入惭嚣,否則,不能識(shí)別cornerRadius和masksToBounds悔政。

uiview設(shè)置背景圖片:
[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 調(diào)用下面事件當(dāng)點(diǎn)擊鍵盤return得時(shí)候就會(huì)隱藏鍵盤- (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 點(diǎn)擊屏幕得時(shí)候隱藏鍵盤-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch=[[event allTouches] anyObject]; if (touch.tapCount >=1) { [chi resignFirstResponder]; [meter resignFirstResponder]; [feet resignFirstResponder]; }}

1-2的方法相當(dāng)于屏幕任何位置的點(diǎn)擊事件(除了各組件的點(diǎn)擊處)可以在這個(gè)方法里執(zhí)行要隱藏或remove的view。

8,UITextField密文顯示輸入內(nèi)容



只需要在TextField屬性中的Secure(安全的)勾選上就可以了谋国。顯示apple默認(rèn)的密文顯示方式槽地。

9,通過系統(tǒng)自帶的NSPredicate使用正則表達(dá)式

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

NSString *regex =[NSString stringWithFormat:@"^1(3[4-9]|5[012789]|8[2378]|47)\d{8}$"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
BOOL isMatch = [predicate evaluateWithObject:editPhoneField.text];

10,項(xiàng)目設(shè)置應(yīng)用程序顯示名稱
1,在項(xiàng)目的Supporting Files下尋找infoPlist.strings文件芦瘾,打開后會(huì)看到一片空白(英文默認(rèn)是跟隨項(xiàng)目名稱顯示)捌蚊。此時(shí),可以就地添加一句代碼:CFBundleDisplayName="愛貝通";
這樣的話近弟,無論手機(jī)設(shè)置英文語言還是中文語言缅糟,應(yīng)用程序都會(huì)顯示設(shè)置的名稱。
2祷愉,為了國際化而言窗宦,我們最好創(chuàng)建一個(gè)chinese專有的infoPlist.strings文件。



如上圖所示谣辞,添加一個(gè)中文的plist
然后打開添加代碼:



這個(gè)時(shí)候迫摔,大功告成。部署在模擬器或真機(jī)中吧泥从,你的手機(jī)設(shè)置(中/英)文語言句占,它就會(huì)調(diào)用相應(yīng)的配置文件。

11,更改Xcode的缺省公司名

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

// testAppDelegate.m
// test
//
// Created by gaohf on 11-5-24.
// Copyright 2011 MyCompanyName. All rights reserved.

    在終端中執(zhí)行以下命令:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{"ORGANIZATIONNAME" = "COMPANY";}'

     **[java]** [view plain](http://blog.csdn.net/mad1989/article/details/7972612#) [copy](http://blog.csdn.net/mad1989/article/details/7972612#)

派生到我的代碼片
派生到我的代碼片

//
// testAppDelegate.m
// test
//
// Created by gaohf on 11-5-24.
// Copyright 2011 COMPANY. All rights reserved.
//

12,在有uinavigation,uitoolbar的情況下躯嫉,如何添加一個(gè)全屏的 uiview (作為顯示一個(gè)進(jìn)度框纱烘,任何區(qū)域無法觸摸而使用)
只需要在要添加view時(shí)侯這樣寫:
[java] view plain copy

派生到我的代碼片
派生到我的代碼片

[[UIApplication sharedApplication].keyWindow addSubview:waitingview];

    這樣椎眯,直接把waitingview添加到了uiWindow上瓶埋,而不是self.view上理疙。再次運(yùn)行祝迂,會(huì)發(fā)現(xiàn)屏幕全部區(qū)域都已經(jīng)遮擋住了。

13,使用了storyboard喷楣,運(yùn)行程序模擬器顯示黑屏
這是由于躲撰,操作不當(dāng)桑逝,獲取點(diǎn)擊了例如 navigationViewController屬性種的in init ViewController選項(xiàng),然后重置了當(dāng)前進(jìn)入程序后的首界面山宾,解決辦法就是選擇入口界面至扰,屬性種重新勾選此選項(xiàng)。

StoryboardApp[8593:207] Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?
StoryBoard中沒有一個(gè)view controller設(shè)置了Initial Scene资锰。您需要選擇一個(gè)view conroller作為story board的第一個(gè)界面:


14,如何給uiNavigationBar 設(shè)置背景顏色或是自定義圖片
在項(xiàng)目中添加如下代碼:
//設(shè)置背景顏色:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

UIColor *itemcolor = [UIColor colorWithRed:100.0f/255.0f green:176.0f/255.0f blue:0.0f/255.0f alpha:0.3f];
self.navigationController.navigationBar.tintColor = itemcolor;

//設(shè)置自定義的圖片:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbg.png"] forBarMetrics:UIBarMetricsDefault];

5.0以上敢课,api有了上面setBackgroundImage的方法,可以直接設(shè)置绷杜,如果項(xiàng)目需要適配5.0以下版本的設(shè)備直秆,最好加一個(gè)判讀,是否有此函數(shù)鞭盟,有則設(shè)置圾结,沒有就通過drawRect方法設(shè)置。

另外:設(shè)置背景圖片無法匹配backButton或rightButtonItem懊缺,所以返回按鈕或右邊自定義的Bar button Item需要自行處理疫稿。

15,如何給uiview設(shè)置背景圖片
在storyboard或xib中,添加一個(gè)uiview鹃两,屬性設(shè)置欄一般都有設(shè)置背景顏色,樣式舀凛,透明度alpha俊扳,但是沒有提供設(shè)置image,只有在imageview中才有猛遍,所以馋记,要想設(shè)置背景圖片,只能在代碼中設(shè)置懊烤,如下:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

[leftNaviView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"pabb_leftnaviview_bg.png"]]];

這樣梯醒,背景就可以變成想要的圖片了。另外腌紧,設(shè)置大腥紫啊:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

[leftNaviView setFrame:CGRectMake(9, 60, 120, 250)];

效果圖:

16,如何在項(xiàng)目用代碼打開AppStore
[java] view plain copy

派生到我的代碼片
派生到我的代碼片

    //以下是通過id打開此軟件的評(píng)價(jià)  

// 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 ];
//以下是通過appstore鏈接到自己應(yīng)用在商店的位置
NSString *url = [NSString stringWithFormat:@"http://itunes.apple.com/cn/app/huo-xing-she-xin-dian/id549425594?l=en&mt=8"];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

把以上代碼直接拷貝到想要實(shí)現(xiàn)點(diǎn)擊跳轉(zhuǎn)的操作方法內(nèi)就可以了,通過appID壁肋,隨意可以通過appstore打開應(yīng)用号胚,直接用url就可以鏈接到了。很簡單浸遗,一般都用在檢查更新的時(shí)候猫胁。

17,如何代碼實(shí)現(xiàn)跳轉(zhuǎn)safari,phone或message跛锌?
在相應(yīng)的代碼中寫入:
1弃秆、調(diào)用 電話phone[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://4008008288"]];
2、調(diào)用自帶 瀏覽器 safari[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.abt.com"]];
3、調(diào)用 自帶mail[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@abt.com"]];
4菠赚、調(diào)用 SMS[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];
5脑豹,跳轉(zhuǎn)到系統(tǒng)設(shè)置相關(guān)界面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];

其中,發(fā)短信锈至,發(fā)Email的功能只能填寫要發(fā)送的地址或號(hào)碼晨缴,無法初始化發(fā)送內(nèi)容,如果想實(shí)現(xiàn)內(nèi)容的話峡捡,還需要更復(fù)雜一些击碗,實(shí)現(xiàn)其各自的委托方法。
若需要傳遞內(nèi)容可以做如下操作:加入:MessageUI.framework #import <MessageUI/MFMessageComposeViewController.h> 實(shí)現(xiàn)代理:MFMessageComposeViewControllerDelegate

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

調(diào)用sendSMS函數(shù)
//內(nèi)容们拙,收件人列表

  • (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
    {

    MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];

    if([MFMessageComposeViewController canSendText])

    {

      controller.body = bodyOfMessage;     
    
      controller.recipients = recipients;  
    
      controller.messageComposeDelegate = self;  
    
      [self presentModalViewController:controller animated:YES];  
    

    }

}

// 處理發(fā)送完的響應(yīng)結(jié)果

  • (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
    {
    [self dismissModalViewControllerAnimated:YES];

    if (result == MessageComposeResultCancelled)
    NSLog(@"Message cancelled")
    else if (result == MessageComposeResultSent)
    NSLog(@"Message sent")
    else
    NSLog(@"Message failed")
    }

發(fā)送郵件的為:
導(dǎo)入#import <MessageUI/MFMailComposeViewController.h>
實(shí)現(xiàn)代理:MFMailComposeViewControllerDelegate

//發(fā)送郵件
-(void)sendMail:(NSString *)subject content:(NSString *)content{

MFMailComposeViewController *controller = [[[MFMailComposeViewController alloc] init] autorelease];  

if([MFMailComposeViewController canSendMail])  

{  

    [controller setSubject:subject];  

    [controller setMessageBody:content isHTML:NO];  

    controller.mailComposeDelegate = self;  

    [self presentModalViewController:controller animated:YES];  

}      

}

//郵件完成處理
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{

[self dismissModalViewControllerAnimated:YES];  

if (result == MessageComposeResultCancelled)  
    NSLog(@"Message cancelled");  
else if (result == MessageComposeResultSent)  
    NSLog(@"Message sent");   
else   
    NSLog(@"Message failed");    

}

默認(rèn)發(fā)送短信的界面為英文的稍途,解決辦法為:在.xib 中的Localization添加一組chinese

18,注冊設(shè)置應(yīng)用程序訪問用戶手機(jī)發(fā)送推送消息(彈出Alertview)
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

19,輕松自定義復(fù)選框按鈕
-(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,程序中獲取軟件的版本號(hào)和app名稱

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

應(yīng)用程序的名稱和版本號(hào)等信息都保存在mainBundle的infoDictionary字典中,用下面代碼可以取出來砚婆。
NSDictionary* infoDict =[[NSBundle mainBundle] infoDictionary];
NSString* versionNum =[infoDict objectForKey:@"CFBundleVersion"];//版本名稱
NSString*appName =[infoDict objectForKey:@"CFBundleDisplayName"];//app名稱

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

<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>];//標(biāo)識(shí)應(yīng)用程序發(fā)布版本號(hào)</p>NSString*text =[NSString stringWithFormat:@"%@ %@",appName,versionNum,<span style="font-family: Menlo; font-size: 11px; white-space: pre; background-color: rgb(240, 240, 240);">versionShortString</span>];

此version 為工程info下的Bundle version字段值:value可以隨意定義械拍。



CFBundleVersion,標(biāo)識(shí)(發(fā)布或未發(fā)布)的內(nèi)部版本號(hào)装盯。這是一個(gè)單調(diào)增加的字符串坷虑,包括一個(gè)或多個(gè)時(shí)期分隔的整數(shù)。
CFBundleShortVersionString 標(biāo)識(shí)應(yīng)用程序的發(fā)布版本號(hào)埂奈。該版本的版本號(hào)是三個(gè)時(shí)期分隔的整數(shù)組成的字符串迄损。第一個(gè)整數(shù)代表重大修改的版本,如實(shí)現(xiàn)新的功能或重大變化的修訂账磺。第二個(gè)整數(shù)表示的修訂芹敌,實(shí)現(xiàn)較突出的特點(diǎn)。第三個(gè)整數(shù)代表維護(hù)版本垮抗。該鍵的值不同于“CFBundleVersion”標(biāo)識(shí)氏捞。 圖片里的 Version 對應(yīng)的就是CFBundleShortVersionString (發(fā)布版本號(hào) 如當(dāng)前上架版本為1.1.0 之后你更新的時(shí)候可以改為1.1.1) Build 對應(yīng)的是 CFBundleVersion(內(nèi)部標(biāo)示,用以記錄開發(fā)版本的冒版,每次更新的時(shí)候都需要比上一次高 如:當(dāng)前版本是11 下一次就要大于11 比如 12液茎,13 ....10000)

21,如何使屏幕一直保持喚醒狀態(tài)?(就是不自動(dòng)黑屏)
比如壤玫,如果我們做一個(gè)播放視頻的功能時(shí)豁护,想在播放的時(shí)候,不會(huì)自動(dòng)進(jìn)入屏保(黑屏)
只要在代碼里加入這一行:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

當(dāng)然欲间,在想要黑屏的時(shí)候還需要把它設(shè)置為NO(比如視頻播放完畢時(shí))楚里,不然屏幕會(huì)在此軟件運(yùn)行下一直亮著。

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



表示在版本控制中班缎,自上一次提交以來蝴光,文件做了修改。貌似只有在帶有版本控制的項(xiàng)目代碼中才會(huì)顯示达址,也就是說你的項(xiàng)目使用了SVN蔑祟、GIT等工具后,會(huì)在Xcode中識(shí)別出來沉唠。
'A' 新增'D' 刪除'M' 修改'R' 替代'C' 沖突'I' 忽略'?' 未受控'!' 丟失疆虚,一般是將受控文件直接刪除導(dǎo)致

23,有關(guān)ios5上屏幕旋轉(zhuǎn),view設(shè)置Frame的相關(guān)問題

屏幕旋轉(zhuǎn)一共有4個(gè)相關(guān)屬性(旋轉(zhuǎn)方向):

UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
前兩個(gè)是橫屏?xí)r的狀態(tài)满葛,后兩個(gè)是正常狀態(tài)(Portrait)和上下顛倒(UpsideDown)時(shí)的狀態(tài)径簿。
【注意:Left和Right兩個(gè)左右模擬器旋轉(zhuǎn)時(shí)移動(dòng)的方向正好是相反的,但移動(dòng)后Home的方向嘀韧,就如下圖所示】
具體見下圖:


其中涉及到兩個(gè)方法篇亭,在ViewController中默認(rèn)會(huì)實(shí)現(xiàn)這個(gè)方法:

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

  • (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
    //除了不允許旋轉(zhuǎn)屏幕后:上下顛倒,其余方向都運(yùn)行旋轉(zhuǎn)
    //如果想都運(yùn)行锄贷,可以直接返回YES译蒂,或都不允許NO
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

}

這個(gè)方法是聲明此ViewController所運(yùn)行屏幕旋轉(zhuǎn)的方向,一共4種類型谊却,全部允許返回YES柔昼,上圖所示除了不允許上下顛倒,其余都可以炎辨≡浪【注意,項(xiàng)目設(shè)置Supported Device Orientations 所支持的屏幕旋轉(zhuǎn)類型并不影響此方法的設(shè)置蹦魔,也就是說,哪怕Support只支持Portrait咳燕,方法里設(shè)置UpsideDown勿决,此ViewController也會(huì)實(shí)現(xiàn)上下顛倒旋轉(zhuǎn)的】

第二個(gè)方法,是我們比較常用的招盲,也就是在設(shè)備即將以某個(gè)方向旋轉(zhuǎn)之前低缩,我們在其狀態(tài)(方向)設(shè)置組件或view的Frame,bound曹货,等需要改變的屬性時(shí)所用到的方法咆繁。

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

//屏幕旋轉(zhuǎn)到橫屏?xí)r  
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {  
    myMapview.frame = CGRectMake(0,0,480, 300);  
}  
//屏幕旋轉(zhuǎn)到豎屏?xí)r  
else{//== else if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation))  
    myMapview.frame = CGRectMake(0, 0, 320,460);  
}  

}

所有旋轉(zhuǎn)屏幕后需要改變組件尺寸屬性的設(shè)置都可以在這個(gè)方法里面實(shí)現(xiàn)。

【注意顶籽,以上兩個(gè)方法玩般,在最新的ios6貌似已經(jīng)不提倡使用了,除非要適應(yīng)舊設(shè)備礼饱,新的旋轉(zhuǎn)屏幕的相關(guān)方法可以網(wǎng)絡(luò)搜索一下】
http://blog.csdn.net/zzfsuiye/article/details/8251060 IOS6屏幕旋轉(zhuǎn)詳解(自動(dòng)旋轉(zhuǎn)坏为、手動(dòng)旋轉(zhuǎn)究驴、兼容IOS6之前系統(tǒng))
http://blog.csdn.net/huifeidexin_1/article/details/7826159 ios旋轉(zhuǎn)屏幕總結(jié) 詳細(xì)教程
http://blog.csdn.net/xiaoyun8822/article/details/8213738 Ios5(三)屏幕的旋轉(zhuǎn)和大小設(shè)置;
以上為參考教程

24,Xcode編譯警告和錯(cuò)誤解決方法
1 Application windows are expected to have a root view controller at the end of application launch

解決方法:在ios5以上版本匀伏,應(yīng)用程序加載時(shí)洒忧,需要一個(gè) root view controller ,所以需要編寫代碼
_rootViewController = [[RootViewController alloc] init];
self.window.rootViewController = _rootViewController;
此問題大多是在Xib或Storyboard下操作ViewController時(shí)不小心連接RootViewController 的底層View所導(dǎo)致的够颠,檢查刪除沒有作用的view連接線熙侍,或是Clean,再運(yùn)行履磨。

25,如何設(shè)置視圖(view)在最上層蛉抓?或是view1和view2交換?
情景再現(xiàn):
我們在storyboard的一個(gè)視圖里添加了一個(gè)view1用作快捷功能導(dǎo)航蹬耘;然后在對應(yīng)的viewController里實(shí)例化了一個(gè)Mapview的地圖view2芝雪,大小是整個(gè)屏幕,這樣一來综苔,就把我們在storyboard中添加的view1覆蓋了惩系,這個(gè)時(shí)候,我們想把view1在地圖view2的上面如筛,該怎么做堡牡?
簡而言之就是window中subview的交換。

首先通過:NSLog(@"subviews:%@",self.view.subviews); 這個(gè)我們可以看到當(dāng)前下所有的subview(NSArray類型)如下圖所示:


可以看到一共有3個(gè)view:UILabel 地圖view2杨刨,添加的view1
我們現(xiàn)在要做的就是把后兩者對調(diào)一下晤柄,所以在self.view 中尋找一下看有沒有replace相關(guān)的方法



就是這個(gè)方法,第一個(gè)參數(shù)是要進(jìn)行調(diào)換的地圖view2妖胀,第二個(gè)參數(shù)是調(diào)換后顯示的view1芥颈。

[self.viewexchangeSubviewAtIndex:1withSubviewAtIndex:2];

因?yàn)橥ㄟ^log打印,我們已經(jīng)知道Mapview在第一個(gè)下標(biāo)的位置赚抡,view1在第二個(gè)下標(biāo)的位置爬坑。

大功告成。記住這個(gè)方法:self.view exchangeSubviewAtIndex:withSubviewAtIndex:];

26,如何隱藏UINavigationBar
有的時(shí)候涂臣,我們的視圖使用了Navigation Controller 盾计,但是主界面(rootviewcontroller)或其它push進(jìn)入的界面 想使用一個(gè)全屏的view,就是說赁遗,不顯示頂部的navigationBar署辉,這個(gè)時(shí)候,就需要我們來隱藏了岩四。

//隱藏NavigationBar
-(void) viewWillAppear:(BOOL)animated{

[self.navigationControllersetNavigationBarHidden:YESanimated:YES]; //設(shè)置隱藏
[super viewWillAppear:animated];

}
-(void) viewWillDisappear:(BOOL)animated{

[self.navigationControllersetNavigationBarHidden:NOanimated:YES];
[super viewWillDisappear:animated];

}

27,如何限制UITextField輸入長度(監(jiān)聽textField文本變化的事件)
1哭尝、實(shí)現(xiàn)UITextFieldDelegate協(xié)議;2炫乓、實(shí)現(xiàn)textField:shouldChangeCharactersInRange:replacementString:方法刚夺;

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
int kMaxLength = 11;

NSInteger strLength = textField.text.length - range.length + string.length;  
//輸入內(nèi)容的長度 - textfield區(qū)域字符長度(一般=輸入字符長度)+替換的字符長度(一般為0)  

return (strLength <= kMaxLength);}

如上代碼献丑,如果我們簡單的這樣寫: if(range.location<=11) return 或是 if (textfield.text.length>=11) 這樣雖然也能限制位數(shù)為11位,但是如果通過放大鏡把光標(biāo)切換到之前的位數(shù)后侠姑,你照樣可以輸入创橄,并且還會(huì)導(dǎo)致輸入11位后,鍵盤上的退格(X鍵)無法使用莽红,原因是:我們在location到達(dá)11位后妥畏,返回了NO,鍵盤無法相應(yīng):添加安吁,修改醉蚁,刪除。這是很嚴(yán)重的鬼店。所以照著我上面的网棍。方法解讀:

  • (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string功能:  把textField中位置為range的字符串替換為string字符串;  此函數(shù)在textField內(nèi)容被修改時(shí)調(diào)用妇智;返回值:  YES滥玷,表示修改生效;NO巍棱,表示不做修改惑畴,textField的內(nèi)容不變。參數(shù)說明:  textField:響應(yīng)UITextFieldDelegate協(xié)議的UITextField控件航徙∪绱  range: UITextField控件中光標(biāo)選中的字符串,即被替換的字符串到踏;       range.length為0時(shí)杠袱,表示在位置range.location插入string∥迅澹  string: 替換字符串霞掺; string.length為0時(shí),表示刪除讹躯。

28,使用ios5.0以后的一個(gè)方法自定義table View Cell

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

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

29,iOS和iPad各app圖標(biāo)和啟動(dòng)頁尺寸
iphone APP圖標(biāo)尺寸:57X57 高清:114X114 單位:pixel 命名:無特殊要求,最好是缠劝,app_icon 高清的要加@2x
iphone 啟動(dòng)頁尺寸:大小最好是320X460或320X480(相當(dāng)于整個(gè)屏幕尺寸) 單位:pixel 命名:Default.png
iPad APP圖標(biāo)尺寸:72X72 高清:144X144 單位:pixel 命名:
ipad 啟動(dòng)頁尺寸:大小最好是768X1004或768X1024 單位:pixel 命名:Default-Portrait~ipad.png 高清:Default-Portrait@2x~ipad.png

30,如何用NSLog輸出NSRange,CGRect等結(jié)構(gòu)體
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要跳轉(zhuǎn)到界面2時(shí)帆竹,把自己self绕娘,set到界面2(前提界面2要設(shè)置一個(gè)id類型的屬性,用來存放界面1self栽连,以此類推险领,當(dāng)在界面3想退到界面1時(shí),
[self.navigationControllerpopToViewController:controlleranimated:YES];

其實(shí)現(xiàn)在剛明白秒紧,一個(gè)很簡單的方法:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

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

想起來navigation的機(jī)制了吧绢陌,每當(dāng)我們push到一個(gè)viewcontroller時(shí),就會(huì)把這個(gè)viewcontroller的實(shí)例保存到nsarray里熔恢,通過array可以獲取到任何一個(gè)viewcontroller章钾,這不就解決問題了么?

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

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

【注意】千萬不要在這個(gè)地方實(shí)例化 界面1 然后popToViewController丝蹭,這種方法是不對的汉操。
32,self.navigationItem.backBarButtonItem 的title設(shè)置

新寫的App中需要使用UINavigationController對各個(gè)頁面進(jìn)行導(dǎo)航,但由于第一級(jí)頁面的title較長凿菩,在進(jìn)入第二級(jí)頁面后返回按鈕leftButtonItem的title就會(huì)變得很長机杜,對NavigationBar空間占用很大,而且不美觀衅谷,于是使用代碼對leftButtonItem的title文本進(jìn)行修改椒拗,無論是設(shè)置self.navigationItem.leftBarButtonItem.title = @"返回";還是self.navigationItem.backBarButtonItem.title = @"返回";都沒有效果,title文本始終不會(huì)發(fā)生變化获黔。到網(wǎng)上亂搜一通后蚀苛,得到了以下解決方法,相對來說比較簡單玷氏,特記錄如下:
在第一級(jí)頁面的viewDidLoad方法中加入以下代碼:
[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title =@"返回";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release]; // 也就是用一個(gè)新的按鈕在進(jìn)行導(dǎo)航前將原來的返回按鈕替換掉就可以了堵未。

所以,通過這個(gè)我們可以明白盏触,self.navigationItem.backBarButtonItem是在一級(jí)頁面設(shè)置的(提前設(shè)置下一個(gè)頁面的返回按鈕)渗蟹,而self.navigationItem.leftBarButtonItem/rightBarButton是在二級(jí)頁面設(shè)置的,(隨意設(shè)置本頁面的左右按鈕赞辩,左按鈕將替代系統(tǒng)的返回按鈕)

一般一個(gè)程序中有一個(gè)UIWindow雌芽,一個(gè)UINavigationController,一個(gè)根UIViewController辨嗽,多個(gè)子UIViewController世落。
UIWindow是整個(gè)可視界面的容器,里面放置我們看到的UIView糟需。UIView負(fù)責(zé)處理屏幕上一個(gè)矩形區(qū)域的繪制屉佳,UIView中還可包含子UIView谷朝。UIWindow是UIView類的擴(kuò)展,可以看作是整個(gè)屏幕的根UIView武花。UIViewController負(fù)責(zé)管理UIView的層次結(jié)構(gòu)圆凰。可以有多個(gè)UIViewController髓堪。
一個(gè)UIViewController中有一個(gè)頂部的UINavigationBar送朱、一個(gè)根UIView,多個(gè)子UIView干旁。UINavigationBar中有一個(gè)UINavigationItem驶沼,UINavigationItem。
UINavigationController是用于構(gòu)建分層應(yīng)用程序的主要工具争群,它維護(hù)了一個(gè)UIViewController棧回怜。這個(gè)棧中必須有一個(gè)根UIViewController,其他的UIViewController都是子UIViewController换薄。
UINavigationItem表示UINavigationBar中的控件玉雾,比如左按鈕、中間標(biāo)題轻要、右按鈕复旬。UINavigationController會(huì)自動(dòng)在當(dāng)前子UIViewController的UINavigationBar左邊添加一個(gè)返回按鈕。按鈕名稱是上一個(gè)UIViewController的標(biāo)題冲泥。
---------------------------------------------------------------------------------------------------------33,self.navigationItem和self.navigationController.navigationItem的區(qū)別驹碍?

/**********************************************/
self.navigationItem
self.navigationController.navigationItem
self.navigationController.navigationBar
/**********************************************/

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

UINavigationItem 本身是用來 定制 ViewController自己在被導(dǎo)航過程中的 appearence, navigationItem是 UIViewController類關(guān)于UINavigationControllerItem類別的擴(kuò)展:

@interface UIViewController (UINavigationControllerItem)

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

...

@end

所以后者 是調(diào)用 VC的所在的導(dǎo)航控制器導(dǎo)航控制器自己自己作為VC的 navigationItem凡恍,是導(dǎo)航的疊加志秃。

  1. UINavigationBar 繼承于 UIView,隸屬于整個(gè) UINavigationController ,用來定義整個(gè)導(dǎo)航過程中的導(dǎo)航欄的顏色等其他數(shù)值嚼酝,(類似于 self.tabBarController.tabBar UINavigationBar ,只需要一個(gè)設(shè)置通用的基本屬性)浮还,只能通過self.navigationController.navigationBar來訪問。

亦因此闽巩,定制于導(dǎo)航堆棧里某個(gè)VC 的時(shí)候钧舌,一般通過self.navigationItem, 比如常用的self.navigationItem.leftBarButtonItem,self.navigationItem.rightButtonItem, 同時(shí)如果自己來定制導(dǎo)航欄的外觀的話涎跨,就要用到self.navigationItem.titleView,這個(gè)可以直接用一個(gè) CustomView 賦值于 self.navigationItem.titleView即可延刘。

此時(shí),如果需要六敬,就得自己畫導(dǎo)航過程中的返回按鈕了。

34,圖片模糊化處理

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

+(UIImage *)scale:(UIImage *)image toSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}

35,NSString轉(zhuǎn)換大小寫的用法
iOS 6中NSString對象有些新的使用方法驾荣,可以讓字符串轉(zhuǎn)變成全部大寫外构,全部小寫普泡,或者每個(gè)單詞首字母大寫。 代碼如下所示:
[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

NSString *str = @"mobile developer tips";

// Convert string to uppercase
NSString *upperStr = [str uppercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"upperStr: %@", upperStr);

// Convert string to caps
NSString *capStr = [upperStr capitalizedStringWithLocale:[NSLocale currentLocale]];
NSLog(@"capStr: %@", capStr);

// Convert string to lowercase
NSString *lowerStr = [capStr lowercaseStringWithLocale:[NSLocale currentLocale]];
NSLog(@"lowerStr: %@", lowerStr);

運(yùn)行結(jié)果:


36,如何獲取手機(jī)硬件信息审编?
通過使用UIDevice:

[[UIDevice currentDevice] systemName];[[UIDevice currentDevice] systemVersion];//os version[[UIDevice currentDevice] uniqueIdentifier];[[UIDevice currentDevice] model];[[UIDevice currentDevice] name];
真機(jī)上結(jié)果:System Name: iPhone OSSystem Version: 4.2.1Unique ID: 9b5ded78d5fa0ac96250f8b4af0e46f40b96ea6dModel: iPhoneName: “wwk”的 iPhone
模擬器上結(jié)果:
System Name: iPhone OSSystem Version: 4.2Unique ID: 21FFE0FF-429B-5D0B-96D2-EADCA3203260Model: iPhone SimulatorName: iPhone Simulator
uniqueIdentifier:iPhone通過撼班,向幾個(gè)硬件標(biāo)識(shí)符和設(shè)備序列號(hào)應(yīng)用內(nèi)部散列算法,而生成這一標(biāo)識(shí)符垒酬。
http://blog.csdn.net/qiwancong/article/details/7914923 參考

37,真機(jī)調(diào)試:could not change executable permissions錯(cuò)誤砰嘁?
雖然更改了新demo的bundle identifier和之前的identifier一樣,但是真機(jī)上還保留著之前調(diào)試時(shí)的demo勘究,所以新的工程如果使用同樣的identifier真機(jī)調(diào)試矮湘,需要先把機(jī)器上原來的demo刪除,再使用新工程調(diào)試口糕。
38,判斷iphone5屏幕的宏定義

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

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

在需要判斷屏幕尺寸的地方:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

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

iphone5的View為568缅阳,減去Nav(44)+任務(wù)欄(20),為504,相比iphone4s及以前版本的480景描,減去Nav+任務(wù)欄十办,為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)錯(cuò)誤

選中項(xiàng)目--target---build settings 找到C++Standard Library 改成:Compiler Default超棺,再編譯就不會(huì)有錯(cuò)誤了.


40,如何調(diào)用系統(tǒng)聲音向族?【iphone 調(diào)用系統(tǒng)鈴聲與震動(dòng)功能】
首先要在工程里加入Audio Toolbox framework這個(gè)庫,然后在需要調(diào)用的文件里#import <AudioToolbox/AudioToolbox.h>最后在需要播放提示音的地方編寫如下代碼:
AudioServicesPlaySystemSound(1000);//新郵件消息提示AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震動(dòng)注:括號(hào)中為系統(tǒng)聲音的id棠绘,詳見請參考以下網(wǎng)址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,重復(fù)調(diào)用2次loadView和viewDidLoad
最好不要在UIViewController的loadView方法中改變狀態(tài)欄的可視性(比如狀態(tài)欄由顯示變?yōu)殡[藏、或者由隱藏變?yōu)轱@示)弄唧,因?yàn)闀?huì)導(dǎo)致重復(fù)調(diào)用2次loadView和viewDidLoad方法适肠。

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

錯(cuò)誤代碼:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

  • (void)loadView {
    NSLog(@"loadView");
    // 隱藏狀態(tài)欄
    [UIApplication sharedApplication].statusBarHidden = YES;

    // .... 創(chuàng)建UIView  
    self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds] autorelease];  
    self.view.backgroundColor = [UIColor grayColor];  
    

    }

    • (void)viewDidLoad {
      [super viewDidLoad];
      NSLog(@"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

雖然運(yùn)行效果是對的,但是系統(tǒng)連續(xù)調(diào)用了2次loadView和viewDidLoad方法候引,導(dǎo)致創(chuàng)建了2次UIView侯养,造成了不必要的開銷。
原因分析:
狀態(tài)欄由顯示變?yōu)殡[藏澄干,意味著屏幕的可用高度變長了逛揩,UIViewController的UIView的高度也要重新調(diào)整,因此系統(tǒng)會(huì)重新調(diào)用loadView方法創(chuàng)建UIView麸俘,創(chuàng)建完畢后再次調(diào)用viewDidLoad方法辩稽。
42,點(diǎn)擊UIButton 無法產(chǎn)生觸摸事件

如果在UIImageView中添加了一個(gè)按鈕,你會(huì)發(fā)現(xiàn)在默認(rèn)情況下這個(gè)按鈕是無法被點(diǎn)擊的从媚,需要設(shè)置UIImageView的userInteractionEnabled為YES:
imageView.userInteractionEnabled = YES;

設(shè)置為YES后逞泄,UIImageView內(nèi)部的按鈕就可以被點(diǎn)擊了
43,如何啟動(dòng)app時(shí)全屏顯示Default.png(圖片)?
大部分app在啟動(dòng)過程中全屏顯示一張背景圖片,比如新浪微博會(huì)顯示這張:


要想在iOS中實(shí)現(xiàn)這種效果喷众,毫無壓力各谚,非常地簡單,把需要全屏顯示的圖片命名為Default.png即可到千,在iOS app啟動(dòng)時(shí)默認(rèn)會(huì)去加載并全屏顯示Default.png昌渤。
也可以用其他名稱來命名圖片,在Info.plist配置一下即可:



配置過后憔四,app啟動(dòng)時(shí)就會(huì)去加載并全屏顯示lufy.png
在默認(rèn)情況下膀息,app顯示Default.png時(shí)并非真正的"全屏顯示",因?yàn)轫敳康臓顟B(tài)欄并沒有被隱藏了赵,比如下面的效果:



大部分情況下潜支,我們都想隱藏狀態(tài)欄,讓Default.png真正全屏顯示斟览。
說到這里毁腿,可能有人馬上就想到了一種辦法:在AppDelegate的application:didFinishLaunchingWithOptions:方法中添加如下代碼:
[UIApplication sharedApplication].statusBarHidden = YES;

我只能說你的思路是對的,但實(shí)際上達(dá)不到想要的效果苛茂,你會(huì)發(fā)現(xiàn)顯示Default.png時(shí)狀態(tài)欄還是存在的已烤,等Default.png顯示完畢后,狀態(tài)欄才被隱藏妓羊。
我先解釋下為什么這種方法不可行胯究,其實(shí)原因很簡單:
1> Default.png是在app啟動(dòng)過程中加載的,并不是在app啟動(dòng)完畢后再加載的
2> AppDelegate的application:didFinishLaunchingWithOptions:方法是在app啟動(dòng)完畢后才調(diào)用的
下面說一下解決方案躁绸,在Info.plist中增加一個(gè)配置即可:



這里的YES表示在app初始化(啟動(dòng))的時(shí)候就隱藏狀態(tài)欄裕循。
當(dāng)然,在Default.png顯示完畢后狀態(tài)欄還是隱藏的净刮。如果想重新顯示狀態(tài)欄,補(bǔ)上下面代碼即可:
[UIApplication sharedApplication].statusBarHidden = NO;

44,使用ASIHTTPRequest保存cookies
假如我的APP淹父,第一次啟動(dòng)請求了登錄接口并得到了Cookie株婴,然后我把APP關(guān)了,下次啟動(dòng)APP暑认,我不請求登錄接口了困介,那上次得到的Cookie就不存在了。如果需要蘸际,那么2種方法座哩,下次啟動(dòng)app,自動(dòng)登入粮彤,這樣能得到服務(wù)器分配給你的cookier(這一種是最好的根穷,因?yàn)閟ession也會(huì)過期)姜骡,還有一種是你把上次登入的時(shí)候,拿到的cookier存起來屿良,然后下次啟動(dòng)app的時(shí)候溶浴,手動(dòng)給請求(ASIHTTP)添加cookie。
所以當(dāng)?shù)谝淮蔚卿洺晒蠊芤梢园裞ookie保存到CoreData,SQLite闯两,UserDefault等褥伴,等到下次網(wǎng)絡(luò)請求時(shí),讀妊恰:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:UserInfoURL]; [request setRequestMethod:@"POST"]; [request addRequestHeader:@"Cookie" value:[NSString stringWithFormat:@"cookie=%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"cookie"]]];//把cookie的值放進(jìn)Header里重慢,這個(gè)cookie的值是一串很長的字符串。

45,UITextField只有當(dāng)有字符輸入后逊躁,鍵盤右下角的搜索/返回/done/等等鍵才可以使用

TextField設(shè)置這個(gè)屬性為YES就可以了似踱,默認(rèn)為NO
searchField.enablesReturnKeyAutomatically =YES;


46,類似QQ等IM軟件,長度和高度不一的聊天氣泡的圖片是如何做的稽煤?拉伸核芽?


其實(shí)是一個(gè)小氣泡png,然后拉伸中間部分酵熙,四個(gè)角不拉動(dòng)轧简,就是局部拉伸。ios自帶方法匾二,四個(gè)角可以不拉伸的哮独,如下:


47,UITableView中有多個(gè)UITextField時(shí),被擋住的TextField如何實(shí)現(xiàn)自動(dòng)向上彈起察藐?
首先要實(shí)現(xiàn)TextField的delegate皮璧,在方法:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

  • (void)textFieldDidBeginEditing:(UITextField *)textField {
    [self.tableView setContentOffset:CGPointMake(0, 70) animated:YES];

}

這說明當(dāng)開始輸入時(shí),tableview在原來的基礎(chǔ)上向上抬起70個(gè)距離分飞。多個(gè)UITextFiled可以通過判斷來使用CGPoint的調(diào)整高度悴务,我這寫的是70.
tableview的scrollEnabled屬性一定要是YES;要不然滾動(dòng)不了了。記得在return時(shí)復(fù)原tableview的位置:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

  • (BOOL)textFieldShouldReturn:(UITextField *)sender {
    [self.tableView setContentOffset:CGPointMake(0, 0) animated:YES];
    return YES;
    }

48,ios如何在調(diào)試時(shí)浸须,輕松找到程序在哪里崩潰惨寿?
我們給自己的工程添加一個(gè)通用的斷點(diǎn):



一步步按上面圖完成操作。
再運(yùn)行程序



自動(dòng)就斷點(diǎn)到這里來了删窒,
log信息是:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

2013-05-20 11:14:19.635 GestureRecognizer[1491:c07] -[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a88df0
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'

這樣很簡單就能發(fā)現(xiàn)程序崩潰是因?yàn)関alue沒有 isEqualToString方法裂垦。如果沒加上面這個(gè)通用的斷點(diǎn),那程序會(huì)直接斷點(diǎn)到main函數(shù)去肌索。
49,UIImageView 如何實(shí)現(xiàn)windows 桌面類似的背景壁紙屏幕(很小的圖片會(huì)顯示N多個(gè))蕉拢?
從UImageView上找ContentMode或clipToBounds是都不管用的,正確的辦法是,不用UImageView晕换,使用UIView午乓,然后設(shè)置backgroundColor屬性為我們的圖片,這樣的話自動(dòng)會(huì)以屏幕的方式顯示闸准。

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

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

下圖所示:(原圖是一個(gè)6X6的方格)


50,UITableViewCell 的backgroundColor不起作用的問題益愈?
在開發(fā)時(shí),想要在tableview中的某一個(gè)Cell設(shè)置選中狀態(tài)夷家,并且Cell的背景顏色是一個(gè)自定義顏色蒸其。

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

<span style="white-space:pre"> </span>//省略....

cell.textLabel.font = [UIFont systemFontOfSize:6.0];  
cell.textLabel.text = @"13832207020";  

if (indexPath.row==0) {  

    [cell setBackgroundColor:[UIColor colorWithRed:100.0f/255.0f green:176.0f/255.0f blue:0.0f/255.0f alpha:1.0f]];  
}  
else{  
    [cell setBackgroundColor:[UIColor whiteColor]];  
}  
  
return cell;  

}

這樣的話,第1行cell就應(yīng)該是我們設(shè)置好的顏色库快,不過請注意摸袁,此方法在UITableViewStylePlain的風(fēng)格下有效,在 UITableViewStyleGrouped的樣式下是無效的义屏!這個(gè)跟tableview的backgroundView和backgroundColor是沒有關(guān)系的靠汁,個(gè)人猜想應(yīng)該是在Grouped風(fēng)格下,cell選中的顏色有系統(tǒng)的view遮罩闽铐,導(dǎo)致我們設(shè)置的無法顯示出來蝶怔。
【補(bǔ)充】如果想在reload或init時(shí)設(shè)置tableview的某一cell為 selected狀態(tài),千萬不要使用cell setSelected:YES animated:YES阳啥,使用tableview的方法:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

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

51,UITableViewCell選中時(shí)contentView中各組件的高亮狀態(tài)
使用系統(tǒng)或簡單自定義的UITableViewCell時(shí)添谊,當(dāng)選中某一行Cell后,除了背景顏色改變外察迟,Cell上所有的組件(數(shù)據(jù))比如UILabel斩狱,UIbutton等都被自動(dòng)顯示成了其
Highlighted(高亮)狀態(tài)下的效果,(如果想顯示出效果扎瓶,你的那些自定義的組件必須要設(shè)置高亮狀態(tài)所踊,比如highlightedTextColor,UIControlStateHighlighted等)概荷,所以這一點(diǎn)需要特別注意秕岛,如果不想要系統(tǒng)的這個(gè)自動(dòng)特效,有兩個(gè)解決辦法:
1误证,組件不設(shè)置highlighted下的屬性
2继薛,如果自定義的Cell:

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

  • (void)setSelected:(BOOL)selected animated:(BOOL)animated
    {

    [super setSelected:selected animated:animated];

    if (selected) {
    //強(qiáng)制系統(tǒng)在UITableViewCell選中時(shí)SettingButton組件的高亮狀態(tài)為NO
    [(UIButton *)[self.contentView.subviews objectAtIndex:1] setHighlighted:NO];
    [settingBtn setImage:BUNDLE_IMAGE(@"accessory_sel") forState:UIControlStateNormal];
    }
    else{
    [settingBtn setImage:BUNDLE_IMAGE(@"accessory_nor") forState:UIControlStateNormal];
    }

}

52,IOS atomic與nonatomic,assign,copy與retain的定義和區(qū)別

atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作愈捅。
** atomic**
設(shè)置成員變量的@property屬性時(shí)遏考,默認(rèn)為atomic,提供多線程安全蓝谨。
在多線程環(huán)境下灌具,原子操作是必要的青团,否則有可能引起錯(cuò)誤的結(jié)果。加了atomic咖楣,setter函數(shù)會(huì)變成下面這樣: {lock} if (property != newValue) { [property release]; property = [newValue retain]; } {unlock}** nonatomic**
禁止多線程督笆,變量保護(hù),提高性能诱贿。 atomic是Objc使用的一種線程保護(hù)技術(shù)娃肿,基本上來講,是防止在寫未完成的時(shí)候被另外一個(gè)線程讀取珠十,造成數(shù)據(jù)錯(cuò)誤咸作。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上宵睦,如果沒有使用多線程間的通訊編程,那么nonatomic是一個(gè)非常好的選擇墅诡。
指出訪問器不是原子操作壳嚎,而默認(rèn)地,訪問器是原子操作末早。這也就是說烟馅,在多線程環(huán)境下,解析的訪問器提供一個(gè)對屬性的安全訪問然磷,從獲取器得到的返回值或者通過設(shè)置器設(shè)置的值可以一次完成郑趁,即便是別的線程也正在對其進(jìn)行訪問。如果你不指定 nonatomic 姿搜,在自己管理內(nèi)存的環(huán)境中寡润,解析的訪問器保留并自動(dòng)釋放返回的值,如果指定了 nonatomic 舅柜,那么訪問器只是簡單地返回這個(gè)值梭纹。

assign 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger,CGFloat)和C數(shù)據(jù)類型(int, float, double, char)等等致份。 此標(biāo)記說明設(shè)置器直接進(jìn)行賦值变抽,這也是默認(rèn)值捌显。在使用垃圾收集的應(yīng)用程序中碍庵,如果你要一個(gè)屬性使用assign,且這個(gè)類符合NSCopying協(xié) 議两波,你就要明確指出這個(gè)標(biāo)記滔蝉,而不是簡單地使用默認(rèn)值击儡,否則的話,你將得到一個(gè)編譯警告锰提。這再次向編譯器說明你確實(shí)需要賦值曙痘,即使它是 可拷貝的芳悲。retain 對其他NSObject和其子類對參數(shù)進(jìn)行release舊值,再retain新值 指定retain會(huì)在賦值時(shí)喚醒傳入值的retain消息边坤。此屬性只能用于Objective-C對象類型名扛,而不能用于Core Foundation對象。(原因很明顯茧痒,retain會(huì)增加對象的引用計(jì)數(shù)肮韧,而基本數(shù)據(jù)類型或者Core Foundation對象都沒有引用計(jì)數(shù)——譯者注)。
注意: 把對象添加到數(shù)組中時(shí)旺订,引用計(jì)數(shù)將增加對象的引用次數(shù)+1弄企。copy 對NSString 它指出,在賦值時(shí)使用傳入值的一份拷貝区拳【辛欤拷貝工作由copy方法執(zhí)行,此屬性只對那些實(shí)行了NSCopying協(xié)議的對象類型有效樱调。更深入的討論约素,請參考“復(fù)制”部分。

copy與retain:
Copy其實(shí)是建立了一個(gè)相同的對象笆凌,而retain不是:1.比如一個(gè)NSString 對象圣猎,地址為0×1111 ,內(nèi)容為@”STR”乞而,Copy 到另外一個(gè)NSString 之后送悔,地址為0×2222 ,內(nèi)容相同爪模。
2.新的對象retain為1 欠啤,舊有對象沒有變化retain 到另外一個(gè)NSString 之后,地址相同(建立一個(gè)指針屋灌,指針拷貝)跪妥,內(nèi)容當(dāng)然相同,這個(gè)對象的retain值+1声滥∶寄欤總結(jié):retain 是指針拷貝,copy 是內(nèi)容拷貝落塑。

assign與retain:

  1. 接觸過C纽疟,那么假設(shè)你用malloc分配了一塊內(nèi)存,并且把它的地址賦值給了指針a憾赁,后來你希望指針b也共享這塊內(nèi)存污朽,于是你又把a(bǔ)賦值給(assign)了b。此時(shí)a和b指向同一塊內(nèi)存龙考,請問當(dāng)a不再需要這塊內(nèi)存蟆肆,能否直接釋放它矾睦?答案是否定的,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存炎功,如果a釋放了枚冗,那么b在使用這塊內(nèi)存的時(shí)候會(huì)引起程序crash掉。2. 了解到1中assign的問題蛇损,那么如何解決赁温?最簡單的一個(gè)方法就是使用引用計(jì)數(shù)(reference counting),還是上面的那個(gè)例子淤齐,我們給那塊內(nèi)存設(shè)一個(gè)引用計(jì)數(shù)股囊,當(dāng)內(nèi)存被分配并且賦值給a時(shí),引用計(jì)數(shù)是1更啄。當(dāng)把a(bǔ)賦值給b時(shí)引用計(jì)數(shù)增加到2稚疹。這時(shí)如果a不再使用這塊內(nèi)存,它只需要把引用計(jì)數(shù)減1祭务,表明自己不再擁有這塊內(nèi)存贫堰。b不再使用這塊內(nèi)存時(shí)也把引用計(jì)數(shù)減1。當(dāng)引用計(jì)數(shù)變?yōu)?的時(shí)候待牵,代表該內(nèi)存不再被任何指針?biāo)茫到y(tǒng)可以把它直接釋放掉喇勋∮Ц茫總結(jié):上面兩點(diǎn)其實(shí)就是assign和retain的區(qū)別,assign就是直接賦值川背,從而可能引起1中的問題贰拿,當(dāng)數(shù)據(jù)為int, float等原生類型時(shí),可以使用assign熄云。retain就如2中所述膨更,使用了引用計(jì)數(shù),retain引起引用計(jì)數(shù)加1, release引起引用計(jì)數(shù)減1缴允,當(dāng)引用計(jì)數(shù)為0時(shí)荚守,dealloc函數(shù)被調(diào)用,內(nèi)存被回收练般。
    53,#pragma mark -#pragma mark Initialization含義
    它們告訴Xcode編譯器矗漾,要在編輯器窗格頂部的方法和函數(shù)彈出菜單中將代碼分隔開;注意 #pragma mark – 的“-”后面不能有空格。如果你的標(biāo)志沒有出現(xiàn)在彈出菜單中薄料,比如沒有分隔線出現(xiàn)敞贡,請?jiān)赬code菜單 “Preferences..”中的 “Code Sense”選項(xiàng)取消選中”Sort listalphabetically”即可。

54,自定義delegate變量聲明時(shí)使用assign還是retain摄职?
我們通過發(fā)送消息給對象出發(fā)特定動(dòng)作;對象發(fā)送某些變化的時(shí)候通過回調(diào)函數(shù)(callback)通知我們誊役。對象在特定事件發(fā)生的時(shí)候获列,就會(huì)調(diào)用對應(yīng)的回調(diào)函數(shù),觸發(fā)業(yè)務(wù)邏輯蛔垢』骱ⅲ回調(diào)函數(shù)通過所謂的代理(Delegation)來實(shí)現(xiàn).
delegate使用方法:
@property (assign) <id>xxxDelegate delegate;
正確的使用方法是使用assign屬性而不是retain。之所以對于delegate這類對象使用assign而不是用retain是為了防止循環(huán)retain(retain loop)

55,給成員變量(屬性)賦值時(shí)使不使用self啦桌?
使用@property和@synthesize聲明一個(gè)成員變量溯壶,給其賦值是時(shí)要在前面加上"self.",以便調(diào)用成員變量的setmember方法甫男。直接調(diào)用成員變量并且給其賦值:member=[NSString stringWithFormat:@””];將不執(zhí)行setmember 方法且改。
使用self調(diào)用成員變量并且給其賦值:self.member=[NSString stringWithFormat:@””];將執(zhí)行setmember方法。

56,如何給UIbutton 同時(shí)設(shè)置圖片(Image)和文字(Title)以及它們的各種狀態(tài)板驳?

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

startRangeButton = [UIButton buttonWithType:UIButtonTypeCustom];
startRangeButton.frame = CGRectMake(85,componentOriginY, regionImage.size.width, 16);
[startRangeButton setBackgroundImage:regionImage forState:UIControlStateNormal];
//還可以設(shè)置其高亮狀態(tài)startRangeButton setBackgroundImage:regionImage forState:UIControlStateHighlighted];
startRangeButton.titleLabel.font = [UIFont systemFontOfSize:7.0];
[startRangeButton setTitle:@"2013-08-01 07:00" forState:UIControlStateNormal];
[startRangeButton setTitleColor:COLOR(101, 199, 240, 1) forState:UIControlStateNormal];
[startRangeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];

代碼中我設(shè)置button背景圖片為自己定義的一個(gè)regionImage又跛,并設(shè)置了button的title = “2013-08-01 07:00”【注意,設(shè)置了背景圖片后若治,title只能這樣添加慨蓝,以button.titleLabel.text方式添加會(huì)無法顯示的】,并且設(shè)置了tiitle正常和高亮下文字顏色端幼。
所以看到這里礼烈,應(yīng)該明白button.setBackgroundImage 和 set Image 的區(qū)別了吧,前者是可以同時(shí)設(shè)置文字婆跑,后者是一旦設(shè)置了image此熬,無法再顯示文字。

普通:
高亮:

57,如何將NSDate類型轉(zhuǎn)化為距離1970/1/1的毫秒差?

[formatter setDateFormat:@"yyyy-MM-dd HH:mm"]; 這種格式得到的數(shù)值是精確到秒的滑进,也就是說少1000犀忱,
但是嘗試[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];或SS大寫,或[formattersetDateFormat:@"yyyy-MM-dd HH:mm.ss.SSS"];都不起作用扶关,最后才發(fā)現(xiàn)阴汇,原來是這樣
NSTimeInterval本身是個(gè)秒級(jí)別的double類型數(shù)值,小數(shù)點(diǎn)后面即毫秒數(shù),*1000.0f即可得到毫秒級(jí)別的時(shí)間差//為了兼容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類型的時(shí)間轉(zhuǎn)換為NSInteger類型,從1970/1/1開始-(long long)getDateTimeTOMilliSeconds:(NSDate )datetime{ NSTimeInterval interval = [datetime timeIntervalSince1970]; NSLog(@"interval=%f",interval); long long totalMilliseconds = interval1000 ; NSLog(@"totalMilliseconds=%llu",totalMilliseconds); return totalMilliseconds; }
也就是說搀庶,計(jì)算結(jié)果再自己乘以1000就可以了

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];

NSDate sDate = [formatter dateFromString:startRangeButton.titleLabel.text];
NSDate eDate = [formatter dateFromString:endRangeButton.titleLabel.text];
NSTimeInterval sinterval = [sDate timeIntervalSince1970];
long long start = sinterval
1000;
NSTimeInterval einterval = [eDate timeIntervalSince1970];
long long end = einterval
1000;
[mConnectionHelper doTrack:mobile startTime:start endTime:end];

58,ios中的全局靜態(tài)變量
Objective-C 支持全局變量
主要有兩種實(shí)現(xiàn)方式:
(1)第一種和C/C++中的一樣, 使用"extern"關(guān)鍵詞铜异;
(2)另外一種就是使用單例實(shí)現(xiàn)地来。
(比如我們經(jīng)常會(huì)把一個(gè)變量放在AppDelegate里面作為全局變量來訪問, 其中AppDelegate就是一個(gè)單例類) 在Objective-C中如何實(shí)現(xiàn)像C++中那樣的靜態(tài)成員變量呢熙掺?你需要做的是在一個(gè)類A的implementation(.m或者.mm)文件中定義一個(gè)static變量未斑,然后為A類定義靜態(tài)成員函數(shù)(class method,也就是類方法)來操作該變量币绩。這樣在其它類中你就不需要?jiǎng)?chuàng)建A類的實(shí)例來對static變量進(jìn)行訪問蜡秽。雖然該static變量并不是A類的靜態(tài)成員變量府阀,但是也算達(dá)到了同樣的效果。static變量的作用域被限制在單一的文件中芽突。
[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

//example.h
@interface Example : NSObject {

}

  • (id)init;
    +(int)instanceCount;
    @end

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

//example.m

import "example.h"

static int count;
@implementation Example
-(id)init{
self = [super init];
if(nil!=self){
count+=1;
}
return self;
}
+(int)instanceCount{
return count;
}
@end

上面的例子中你就可以通過[Example instanceCount]對靜態(tài)變量count進(jìn)行訪問试浙,無須創(chuàng)建實(shí)例。警告: static 寫在interface外面編譯是沒有錯(cuò)誤的寞蚌,但是編譯器會(huì)報(bào)警告田巴,這么說這樣的寫法是不被編輯器認(rèn)可的。錯(cuò)誤:static 寫在interface里面會(huì)直接報(bào)錯(cuò)挟秤,顯然這樣的語法是不被認(rèn)可的壹哺。
static關(guān)鍵字聲明的變量必須放在implementation外面,或者方法中艘刚,如果不為它賦值默認(rèn)為0管宵,它只在程序開機(jī)初始化一次。
59,如何使用 NSNotificationCenter 在viewcontroller之間進(jìn)行傳值攀甚?
簡單點(diǎn)的來箩朴,兩個(gè)界面間傳值,直接上代碼了:
sendViewcontroller.m

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

//SettingViewController :接受值的viewcontroller
SettingViewController *setting = [[SettingViewController alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:setting selector:@selector(received:) name:@"msetting" object:nil];
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"user",@"type", nil];

[[NSNotificationCenter defaultCenter] postNotificationName:@"msetting" object:dict];
[self.navigationController pushViewController:setting animated:YES];

[setting release];

SettingViewController.m(接收值的viewcontroller)

[cpp] view plain copy

派生到我的代碼片
派生到我的代碼片

-(void)received:(NSNotification *)notification{

id data = [notification object];  
NSLog(@"received data: %@",data);  

}

這樣就實(shí)現(xiàn)了基本的使用秋度,跟delegate類似炸庞,注意 addObserver時(shí),需要寫目標(biāo)viewcontroller的實(shí)例荚斯,而不是self埠居。

60,Thread EXC_BAD_ACCESS : objc_retain, objc_getProperty 崩潰錯(cuò)誤



如上圖所示,遇到這個(gè)錯(cuò)誤鲸拥,從字面的意思我們大致能猜到,是有屬性已經(jīng)被release掉了僧免,但是我們又使用它了刑赶,所以,一部一部排查把懂衩,一定有某個(gè)地方的屬性提前被release掉了撞叨,自己手動(dòng)管理內(nèi)存就會(huì)有這樣的困惱,代碼很多浊洞,不想去找牵敷,一定要有耐心,找的過程還可以學(xué)到很多知識(shí)法希。



如上圖枷餐,這個(gè)就是我找到的原因所在,unarchiver release掉了苫亦,而我們在其它的類中想使用location的屬性毛肋。

61,MAC 終端(bash)svn命令不識(shí)別 command not found
在mac os 10.8中怨咪,svn Command line tools是沒有自動(dòng)安裝的,這樣的話润匙,svn 命令行就會(huì)失效诗眨,解決辦法:1.打開xcode偏好設(shè)置(comand+,)-->"Download" -->Components:



2.點(diǎn)擊“Command line tools”下載孕讳,下載完成之后安裝匠楚。
3.安裝完成之后,打開終端厂财,輸入“svn help”芋簿,如果出現(xiàn)如下所示,說明命令行工具安裝好了蟀苛。


62,ios MapKit 判斷坐標(biāo)是否在MapView顯示范圍內(nèi)

[java] view plain copy

派生到我的代碼片
派生到我的代碼片

CLLocationDegrees leftDegrees = mapView.region.center.longitude –(mapView.region.span.longitudeDelta / 2.0);
CLLocationDegrees rightDegrees = mapView.region.center.longitude +(mapView.region.span.longitudeDelta / 2.0);
CLLocationDegrees bottomDegrees = mapView.region.center.latitude –(mapView.region.span.latitudeDelta / 2.0);
CLLocationDegrees topDegrees = self.region.center.latitude +(mapView.region.span.latitudeDelta / 2.0);
if (leftDegrees > rightDegrees) { // Int'l Date Line in View
leftDegrees = -180.0 - leftDegrees;
if (coords.longitude > 0) // coords to West of Date Line
coords.longitude = -180.0 - coords.longitude;
}
If (leftDegrees <= coords.longitude && coords.longitude <= rightDegrees && bottomDegrees <= coords.latitude && coords.latitude <= topDegrees) {
// 坐標(biāo)在范圍內(nèi)
}

63,簡單的冒泡排序法

[objc] view plain copy

派生到我的代碼片
派生到我的代碼片

-(void) doDesc{  
  
      
    int list[12] = {12,42,21,45,6,13,89,23,48,74,3,32};  
      
  
    for (int i=0; i<=11; i++) {  
         
          
          
        for (int j=11; j>i; j--) {  
              
            //從大到小  
//            if (list[j]>list[j-1]) {  
//                int temp =list[j];  
//                list[j] = list[j-1];  
//                list[j-1] = temp;  
//                  
//            }  
            //從小到大  
              
            if (list[j]<list[j-1]) {  
                int temp = list[j-1];  
                list[j-1] = list[j];  
                list[j] = temp;  
            }  
              
        }  
   
    }  
      
    for (int k =0 ; k<12; k++) {  
        NSLog(@"%d == %d",k,list[k]);  
  
    }     
      
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末益咬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帜平,更是在濱河造成了極大的恐慌幽告,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裆甩,死亡現(xiàn)場離奇詭異冗锁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嗤栓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門冻河,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茉帅,你說我怎么就攤上這事叨叙。” “怎么了堪澎?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵擂错,是天一觀的道長。 經(jīng)常有香客問我樱蛤,道長钮呀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任昨凡,我火速辦了婚禮爽醋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘便脊。我一直安慰自己蚂四,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著证杭,像睡著了一般田度。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上解愤,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天镇饺,我揣著相機(jī)與錄音,去河邊找鬼送讲。 笑死奸笤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哼鬓。 我是一名探鬼主播监右,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼异希!你這毒婦竟也來了健盒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤称簿,失蹤者是張志新(化名)和其女友劉穎扣癣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體憨降,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡父虑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了授药。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士嚎。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悔叽,靈堂內(nèi)的尸體忽然破棺而出莱衩,到底是詐尸還是另有隱情,我是刑警寧澤娇澎,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布笨蚁,位于F島的核電站,受9級(jí)特大地震影響九火,放射性物質(zhì)發(fā)生泄漏赚窃。R本人自食惡果不足惜册招,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一岔激、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧是掰,春花似錦虑鼎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匾七。三九已至,卻和暖如春江兢,著一層夾襖步出監(jiān)牢的瞬間昨忆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工杉允, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑贴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓叔磷,卻偏偏與公主長得像拢驾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子改基,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 重點(diǎn)參考鏈接: View Programming Guide for iOS https://developer....
    Kevin_Junbaozi閱讀 4,397評(píng)論 0 15
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開發(fā)繁疤,例如說新浪微博、微信等秕狰,這些應(yīng)用本身可...
    lichengjin閱讀 3,639評(píng)論 2 7
  • 1.OC里用到集合類是什么稠腊? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,359評(píng)論 0 3
  • 1.設(shè)計(jì)模式是什么封恰? 你知道哪些設(shè)計(jì)模式麻养,并簡要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)诺舔,就是用比較成熟的邏輯去處理某一種類...
    司馬DE晴空閱讀 1,277評(píng)論 0 7
  • 親愛的葳葳: 今天是你9周歲的生日鳖昌,9年前的今天,伴隨著你嘹亮的啼哭聲來到了這個(gè)世界低飒。不得不慚愧的告訴你许昨,媽媽因?yàn)?..
    畢丹丹閱讀 231評(píng)論 0 5