你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 【解決方法】iOS 開發小技巧

【解決方法】iOS 開發小技巧

編輯:IOS開發綜合

1,Search Bar 怎樣去掉背景的顏色(storyboard裡只能設置background顏色,可是發現clear Color無法使用)。

其實在代碼裡還是可以設置的,那就是刪除背景view

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

2,NSDate:

字母日期或時間元素表示示例 GEra標志符TextAD y年Year199696 M年中的月份MonthJuly;Jul;07 w年中的周數Number27 W月份中的周數Number2 D年中的天數Number189 d月份中的天數Number10 F月份中的星期Number2 E星期中的天數TextTuesday;Tue aAm/pm標記TextPM H一天中的小時數(0-23)Number0 k一天中的小時數(1-24)Number24 Kam/pm中的小時數(0-11)Number0 ham/pm中的小時數(1-12)Number12 m小時中的分鐘數Number30 s分鐘中的秒數Number55 S毫秒數Number978 z時區GeneraltimezonePacificStandardTime;PST;GMT-08:00 Z時區RFC822timezone-0800

 

 

[注意]在開發中,如果使用年月日,用NSDateFormatter setFormat :@"yyyy-MM-dd",如果是使用小時和分鐘,設置為:"HH:mm",切記不要設置“HH-mm”,這樣會出錯的。

舉例:

//創建一個時間對象 NSData*date=[NSDatedate]; //打印時間 NSLog(@"todayis%@",date);   //再獲取的時間date減去24小時的時間(昨天的這個時候) NSDate*yesterday=[NSDatedateWithTimeIntervalSinceNow:-(24*60*60)]; NSLog(@"yesterdayis%@",yesterday);//打印昨天的時間   /*字符串換成時間*/ //設置一個字符串的時間 NSString*datestring=[NSStringstringWithFormat:@"1999-09-03"]; //想要設置自己想要的格式,可以用nsdateformatter這個類,這裡是初始化 NSDateFormatter*dm=[[NSDateFormatteralloc]init]; //指定輸出的格式這裡格式必須是和上面定義字符串的格式相同,否則輸出空 [dmsetDateFormat:@"yyyy-MM-dd"]; //把字符串的時間轉換成Date對象,用dateFromString方法 NSDate*newdate=[dmdateFromString:datestring]; //輸出 NSLog(@"newdateis%@",newdate);     /*把時間轉換成字符串*/ //把Date對象轉換成String對象用stringFromDate方法 NSString*datestring2=[dmstringFromDate:newdate]; //打印 NSLog(@"datestring2is%@",datestring2);

 

 

3,如果使用 UTTabviewCell,設置其accessory樣式為:Detail Disclosure ,就是在每一個cell右邊設置一個detail button。如果這樣的操作是使用storyboard,進行的,它會要求你給每一個你cell設置indentifier,然後你會在以下方法內設置重用indentfier,別忘記加上一句話,否則編譯運行時可能會彈出: cell未實例化

\

 

4,在開發項目中,有時有這樣的需求:運行程序,登陸界面是一個自由的ViewController,只是擺放幾個TextField和button,點擊後跳轉到孩子選擇或其它選擇界面,點擊選項後進入我們的主界面:這個時候,在登陸界面作跳轉時,會有好多的方法,如果使用storyboard,就比較方便了,設置一個segue,跳轉代碼中:

[self PerformSegueWithIdentifier:@"targetViewController",self]; 就可以了,可是我想實例化想要跳轉的控制器,然後設置某一屬性的值,這樣跳轉後控制器獲取那個屬性,就會得到值了,可是這樣做會有一個問題:

主界面控制器如果使用了navigatorViewController,並且是其RootViewController,等到在主界面設置功能,點擊某一功能,想push到一個新頁面時,問題就來了,你會發現毫無反應,沒有報錯,只是segue無法跳轉。後來終於找到原因:就是我在登陸控制器跳轉時沒有使用segue的方法,而是用代碼self.storyboard,加載一個新類,具體原理目前還沒有搞明白,先把出問題的代碼記錄下來,回頭補之:

\

代碼這樣做,會導致其後無法使用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 = ,代表著這是一個空字符串,賦值為空,指針是存在的,只是內容為空,這種判斷需要使用:

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 導入,否則,不能識別cornerRadius和masksToBounds。

 

uiview設置背景圖片:

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

 

imageName 緩存,下面方法不緩存

NSString*thePath=[[NSBundlemainBundle]pathForResource:@"default"ofType:@"jpeg"];
UIImage*prodImg=[[UIImagealloc]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中)

 

 NSString*regex=[NSStringstringWithFormat:@"^1(3[4-9]|5[012789]|8[2378]|47)\\d{8}$"]; NSPredicate*predicate=[NSPredicatepredicateWithFormat:@"SELFMATCHES%@",regex]; BOOLisMatch=[predicateevaluateWithObject:editPhoneField.text];

 

10,項目設置應用程序顯示名稱:

1,在項目的Supporting Files下尋找infoPlist.strings文件,打開後會看到一片空白(英文默認是跟隨項目名稱顯示)。此時,可以就地添加一句代碼:CFBundleDisplayName="愛貝通";

這樣的話,無論手機設置英文語言還是中文語言,應用程序都會顯示設置的名稱。

2,為了國際化而言,我們最好創建一個chinese專有的infoPlist.strings文件。

\

如上圖所示,添加一個中文的plist

然後打開添加代碼:

\

這個時候,大功告成。部署在模擬器或真機中吧,你的手機設置(中/英)文語言,它就會調用相應的配置文件。

 

11更改Xcode的缺省公司名

 

//testAppDelegate.m //test // //Createdbygaohfon11-5-24. //Copyright2011__MyCompanyName__.Allrightsreserved. 在終端中執行以下命令:

 

defaultswritecom.apple.XcodePBXCustomTemplateMacroDefinitions'{"ORGANIZATIONNAME"="COMPANY";}'  // //testAppDelegate.m //test // //Createdbygaohfon11-5-24. //Copyright2011COMPANY.Allrightsreserved. //

 

12,在有uinavigation,uitoolbar的情況下,如何添加一個全屏的 uiview (一般是作為顯示一個進度框,任何區域無法觸摸而使用)

只需要在要添加view時侯這樣寫:


[[UIApplicationsharedApplication].keyWindowaddSubview: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 設置背景顏色或是自定義圖片?

在項目中添加如下代碼:

//設置背景顏色:

UIColor*itemcolor=[UIColorcolorWithRed:100.0f/255.0fgreen:176.0f/255.0fblue:0.0f/255.0falpha:0.3f]; self.navigationController.navigationBar.tintColor=itemcolor;
//設置自定義的圖片:

[self.navigationController.navigationBarsetBackgroundImage:[UIImageimageNamed:@"navbg.png"]forBarMetrics:UIBarMetricsDefault];
5.0以上,api有了上面setBackgroundImage的方法,可以直接設置,如果項目需要適配5.0以下版本的設備,最好加一個判讀,是否有此函數,有則設置,沒有就通過drawRect方法設置。

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

15,如何給uiview設置背景圖片?

在storyboard或xib中,添加一個uiview,屬性設置欄一般都有設置背景顏色,樣式,透明度alpha,但是沒有提供設置image,只有在imageview中才有,所以,要想設置背景圖片,只能在代碼中設置,如下:

 [leftNaviViewsetBackgroundColor:[UIColorcolorWithPatternImage:[UIImageimageNamed:@"pabb_leftnaviview_bg.png"]]];
這樣,背景就可以變成想要的圖片了。另外,設置大小:

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

效果圖:


\

 

16如何在項目用代碼打開AppStore軟件(也就是訪問appstore)

 //以下是通過id打開此軟件的評價 //intm_appleID=576337094; //NSString*str=[NSStringstringWithFormat: //@"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d", //m_appleID]; //以下是通過appstore鏈接到自己應用在商店的位置 NSString*url=[NSStringstringWithFormat:@"http://itunes.apple.com/cn/app/huo-xing-she-xin-dian/id549425594?l=en&mt=8"]; [[UIApplicationsharedApplication]openURL:[NSURLURLWithString: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"]];

2、調用自帶 浏覽器 safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.abt.com"]];

3、調用 自帶mail
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://[email protected]"]];

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

5,跳轉到系統設置相關界面

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

其中,發短信,發Email的功能只能填寫要發送的地址或號碼,無法初始化發送內容,如果想實現內容的話,還需要更復雜一些,實現其各自的委托方法。

若需要傳遞內容可以做如下操作:
加入:MessageUI.framework

#import

實現代理:MFMessageComposeViewControllerDelegate

 調用sendSMS函數 //內容,收件人列表 -(void)sendSMS:(NSString*)bodyOfMessagerecipientList:(NSArray*)recipients {   MFMessageComposeViewController*controller=[[[MFMessageComposeViewControlleralloc]init]autorelease];   if([MFMessageComposeViewControllercanSendText])   {   controller.body=bodyOfMessage;   controller.recipients=recipients;   controller.messageComposeDelegate=self;   [selfpresentModalViewController:controlleranimated:YES];   }   }   //處理發送完的響應結果 -(void)messageComposeViewController:(MFMessageComposeViewController*)controllerdidFinishWithResult:(MessageComposeResult)result { [selfdismissModalViewControllerAnimated:YES];   if(result==MessageComposeResultCancelled) NSLog(@"Messagecancelled") elseif(result==MessageComposeResultSent) NSLog(@"Messagesent") else NSLog(@"Messagefailed") }     發送郵件的為: 導入#import 實現代理:MFMailComposeViewControllerDelegate   //發送郵件 -(void)sendMail:(NSString*)subjectcontent:(NSString*)content{   MFMailComposeViewController*controller=[[[MFMailComposeViewControlleralloc]init]autorelease];   if([MFMailComposeViewControllercanSendMail])   {   [controllersetSubject:subject];   [controllersetMessageBody:contentisHTML:NO];   controller.mailComposeDelegate=self;   [selfpresentModalViewController:controlleranimated:YES];   } }   //郵件完成處理 -(void)mailComposeController:(MFMailComposeViewController*)controllerdidFinishWithResult:(MFMailComposeResult)resulterror:(NSError*)error{   [selfdismissModalViewControllerAnimated:YES];   if(result==MessageComposeResultCancelled) NSLog(@"Messagecancelled"); elseif(result==MessageComposeResultSent) NSLog(@"Messagesent"); else NSLog(@"Messagefailed");   }   默認發送短信的界面為英文的,解決辦法為:在.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名稱

 應用程序的名稱和版本號等信息都保存在mainBundle的infoDictionary字典中,用下面代碼可以取出來。 NSDictionary*infoDict=[[NSBundlemainBundle]infoDictionary]; NSString*versionNum=[infoDictobjectForKey:@"CFBundleVersion"];//版本名稱 NSString*appName=[infoDictobjectForKey:@"CFBundleDisplayName"];//app名稱 NSString*text=[NSStringstringWithFormat:@"%@%@",appName,versionNum];

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

 

\

 

21,如何使屏幕一直保持喚醒狀態?(就是不自動黑屏)

 

比如,如果我們做一個播放視頻的功能時,想在播放的時候,不會自動進入屏保(黑屏)

只要在代碼裡加入這一行:

 [[UIApplicationsharedApplication]setIdleTimerDisabled:YES];

當然,在想要黑屏的時候還需要把它設置為NO(比如視頻播放完畢時),不然屏幕會在此軟件運行下一直亮著。

 

22,一直以來的疑問:在Xcode中,有時候在類名稱後邊帶有M或C等標示,不知道為何意。如下圖所示:

\

表示在版本控制中,自上一次提交以來,文件做了修改。貌似只有在帶有版本控制的項目代碼中才會顯示。

 

23,有關ios上屏幕旋轉,view設置Frame的相關問題(ios5)。

屏幕旋轉一共有4個相關屬性(旋轉方向):

UIInterfaceOrientationLandscapeLeft

UIInterfaceOrientationLandscapeRight

UIInterfaceOrientationPortrait

UIInterfaceOrientationPortraitUpsideDown

前兩個是橫屏時的狀態,後兩個是正常狀態(Portrait)和上下顛倒(UpsideDown)時的狀態。

【注意:Left和Right兩個左右模擬器旋轉時移動的方向正好是相反的,但移動後Home的方向,就如下圖所示】

具體見下圖:

\

 

其中涉及到兩個方法,在ViewController中默認會實現這個方法:

 -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { //除了不允許旋轉屏幕後:上下顛倒,其余方向都運行旋轉 //如果想都運行,可以直接返回YES,或都不允許NO return(interfaceOrientation!=UIInterfaceOrientationPortraitUpsideDown);   } 這個方法是聲明此ViewController所運行屏幕旋轉的方向,一共4種類型,全部允許返回YES,上圖所示除了不允許上下顛倒,其余都可以。【注意,項目設置Supported Device Orientations 所支持的屏幕旋轉類型並不影響此方法的設置,也就是說,哪怕Support只支持Portrait,方法裡設置UpsideDown,此ViewController也會實現上下顛倒旋轉的】

第二個方法,是我們比較常用的,也就是在設備即將以某個方向旋轉之前,我們在其狀態(方向)設置組件或view的Frame,bound,等需要改變的屬性時所用到的方法。

 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientationduration:(NSTimeInterval)duration{   //屏幕旋轉到橫屏時 if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)){ myMapview.frame=CGRectMake(0,0,480,300); } //屏幕旋轉到豎屏時 else{//==elseif(UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) myMapview.frame=CGRectMake(0,0,320,460); }   }

所有旋轉屏幕後需要改變組件尺寸屬性的設置都可以在這個方法裡面實現。

【注意,以上兩個方法,在最新的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/8213738Ios5(三)屏幕的旋轉和大小設置;

以上為參考教程

24,Xcode編譯警告和錯誤解決方法:

1Application 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.viewexchangeSubviewAtIndex:withSubviewAtIndex:];

26,如何隱藏UINavigationBar

有的時候,我們的視圖使用了Navigation Controller ,但是主界面(rootviewcontroller)或其它push進入的界面 想使用一個全屏的view,就是說,不顯示頂部的navigationBar,這個時候,就需要我們來隱藏了。

//隱藏NavigationBar

-(void) viewWillAppear:(BOOL)animated{

[self.navigationControllersetNavigationBarHidden:YESanimated:YES]; //設置隱藏

[superviewWillAppear:animated];

}

-(void) viewWillDisappear:(BOOL)animated{

 

[self.navigationControllersetNavigationBarHidden:NOanimated:YES];

[superviewWillDisappear:animated];

}

27,如何限制UITextField輸入長度(監聽textField文本變化的事件)

1、實現UITextFieldDelegate協議;


2、實現textField:shouldChangeCharactersInRange:replacementString:方法;

-(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString*)string{ intkMaxLength=11;     NSIntegerstrLength=textField.text.length-range.length+string.length; //輸入內容的長度-textfield區域字符長度(一般=輸入字符長度)+替換的字符長度(一般為0) 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

 UINib*nib=[UINibnibWithNibName:@"TvWeiboCell"bundle:nil]; [tableViewregisterNib:nibforCellReuseIdentifier: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];

 

其實現在剛明白,一個很簡單的方法:

 

NSArray*viewControllers=[self.navigationControllerviewControllers]; UIViewController*controller=[viewControllersobjectAtIndex:1];

 

想起來navigation的機制了吧,每當我們push到一個viewcontroller時,就會把這個viewcontroller的實例保存到nsarray裡,通過array可以獲取到任何一個viewcontroller,這不就解決問題了麼?

 

 [self.navigationControllerpopToViewController:controlleranimated: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方法中加入以下代碼:

 

 UIBarButtonItem*temporaryBarButtonItem=[[UIBarButtonItemalloc]init]; temporaryBarButtonItem.title=@"返回"; self.navigationItem.backBarButtonItem=temporaryBarButtonItem; [temporaryBarButtonItemrelease];//也就是用一個新的按鈕在進行導航前將原來的返回按鈕替換掉就可以了。 所以,通過這個我們可以明白,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的標題。

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

 

 

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類別的擴展:

 

@interfaceUIViewController (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,圖片模糊化處理

 

+(UIImage*)scale:(UIImage*)imagetoSize:(CGSize)size { UIGraphicsBeginImageContext(size); [imagedrawInRect:CGRectMake(0,0,size.width,size.height)]; UIImage*scaledImage=UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); returnscaledImage; }

 

35,NSString轉換大小寫的用法

iOS 6中NSString對象有些新的使用方法,可以讓字符串轉變成全部大寫,全部小寫,或者每個單詞首字母大寫。

代碼如下所示:

NSString*str=@"mobiledevelopertips";   //Convertstringtouppercase NSString*upperStr=[struppercaseStringWithLocale:[NSLocalecurrentLocale]]; NSLog(@"upperStr:%@",upperStr);   //Convertstringtocaps NSString*capStr=[upperStrcapitalizedStringWithLocale:[NSLocalecurrentLocale]]; NSLog(@"capStr:%@",capStr);   //Convertstringtolowercase NSString*lowerStr=[capStrlowercaseStringWithLocale:[NSLocalecurrentLocale]]; NSLog(@"lowerStr:%@",lowerStr); 運行結果:

 

\

 

 

36,如何獲取手機硬件信息?

通過使用UIDevice:

 

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

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

模擬器上結果:

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

uniqueIdentifier:iPhone通過,向幾個硬件標識符和設備序列號應用內部散列算法,而生成這一標識符。

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

 

36,真機調試:could not change executable permissions錯誤?

雖然更改了新demo的bundle identifier和之前的identifier一樣,但是真機上還保留著之前調試時的demo,所以新的工程如果使用同樣的identifier真機調試,需要先把機器上原來的demo刪除,再使用新工程調試。

 

37,判斷iphone5屏幕的宏定義

 

 #defineiPhone5([UIScreeninstancesRespondToSelector:@selector(currentMode)]?CGSizeEqualToSize(CGSizeMake(640,1136),[[UIScreenmainScreen]currentMode].size):NO)

 

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

 

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

 

iphone5的View為568,減去Nav(44)+任務欄(20),為504,相比iphone4s及以前版本的480,減去Nav+任務欄,為416,高出88(差別).

 

38、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

最後在需要播放提示音的地方編寫如下代碼:

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

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震動

注:括號中為系統聲音的id,詳見請參考以下網址http://iphonedevwiki.net/index.php/AudioServices。

40,重復調用2次loadView和viewDidLoad

最好不要在UIViewController的loadView方法中改變狀態欄的可視性(比如狀態欄由顯示變為隱藏、或者由隱藏變為顯示),因為會導致重復調用2次loadView和viewDidLoad方法。

錯誤代碼: -(void)loadView{ NSLog(@"loadView"); //隱藏狀態欄 [UIApplicationsharedApplication].statusBarHidden=YES;   //....創建UIView self.view=[[[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds]autorelease]; self.view.backgroundColor=[UIColorgrayColor]; }   -(void)viewDidLoad{ [superviewDidLoad]; 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

雖然運行效果是對的,但是系統連續調用了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;

\

 

44、判斷是不是iPhone5

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

用時候直接


if (iPhone5) ooxx

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved