iOS項目開發中的知識點與問題收集整理(Part 一)

来源:http://www.cnblogs.com/ChinaKingKong/archive/2016/04/23/5426058.html
-Advertisement-
Play Games

前言部分 註:本文並非絕對原創 大部分內容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已過時並不適用於現在的開發環境。 1、Search Bar 怎樣去掉背景的顏色(storyboard里只能設置backg ...


前言部分

註:本文並非絕對原創 大部分內容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045

文中有些方法可能已過時並不適用於現在的開發環境。

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

其實在代碼里還是可以設置的,那就是刪除背景view
 [[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];  

2、NSDate 詳解:   

 1 字母  日期或時間元素    表示     示例       
 2 G     Era   標誌符     Text     AD       
 3 y     年     Year     1996 96       
 4 M     年中的月份     Month     July;   Jul; 07       
 5 w     年中的周數     Number     27       
 6 W     月份中的周數        Number     2       
 7 D     年中的天數     Number     189       
 8 d     月份中的天數        Number        10       
 9 F     月份中的星期     Number        2       
10 E     星期中的天數    Text     Tuesday;   Tue       
11 a     Am/pm   標記        Text     PM       
12 H     一天中的小時數(0-23)     Number       0       
13 k     一天中的小時數(1-24)      Number     24       
14 K     am/pm   中的小時數(0-11)     Number    0       
15 h     am/pm   中的小時數(1-12)     Number    12       
16 m     小時中的分鐘數        Number     30       
17 s     分鐘中的秒數         Number     55       
18 S     毫秒數         Number     978       
19 z     時區     General   time   zone     Pacific   Standard   Time;   PST;   GMT-08:00       
20 Z     時區     RFC   822   time   zone     -0800     

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

 1 //創建一個時間對象  
 2     NSData * date = [NSDate date];  
 3     //列印時間  
 4     NSLog(@"today is %@",date);  
 5       
 6     //再獲取的時間date減去24小時的時間(昨天的這個時候)  
 7     NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(24*60*60)];  
 8     NSLog(@"yesterday is %@",yesterday);//列印昨天的時間  
 9       
10     /*字元串換成時間*/   
11     //設置一個字元串的時間  
12     NSString *datestring = [NSString stringWithFormat:@"1999-09-03"];   
13     //想要設置自己想要的格式,可以用nsdateformatter這個類,這裡是初始化  
14     NSDateFormatter * dm = [[NSDateFormatter alloc]init];   
15     //指定輸出的格式   這裡格式必須是和上面定義字元串的格式相同,否則輸出空  
16     [dm setDateFormat:@"yyyy-MM-dd"];  
17     //把字元串的時間轉換成Date對象,用dateFromString方法  
18     NSDate * newdate = [dm dateFromString:datestring];  
19     //輸出  
20     NSLog(@"newdate is %@",newdate);  
21       
22       
23     /*把時間轉換成字元串*/  
24     //把Date對象轉換成String對象  用stringFromDate方法  
25     NSString * datestring2 = [dm stringFromDate:newdate];  
26     //列印  
27     NSLog(@"datestring2 is %@",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、 開發過程中,我們通過http請求,後臺返回json數據,而有時數據里某一欄位的值為null~,然後我們把此值賦值給 NSArray,NSdictionary,或是NSString,然後我們會判斷此值為null時,所做的處理,而通常慣性思維判斷時我們都會 寫:if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil),我們發現,都不好用,根本沒有起到判斷的作用~後來我才發現,原來不能這樣來判斷。    

 

簡單點說,就是當字典,數組為null時,後臺列印的輸出結果是這樣:


然後,我們需要在代碼判斷時利用[NSNull null]來判斷,具體如:


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


控制台列印:str=(null) 代表著 字元串或數組或字典是一個空指針,(而非空字元串)判斷的時候,直接用:

if(str == nil)就可以了。如下圖所示:



而控制台列印:str =  <null>,代表著這是一個空字元串,賦值為空,指針是存在的,只是內容為空,這種判斷需要使用:

if(str is equal [NSNull null ]) ,因為在ios上,內容為空不能簡單的判斷str==null(null 在ios上得用[NSNull null])


一般這種情況是,伺服器那邊是null,直接返回@"null"的字元串,這樣在ios這邊不好判斷,最好跟後臺溝通,如果遇到null值,返回@"",好做判斷  

6、給uiview設置圓角樣式   

只需在載入時,添加這樣的話就可以了:  

testView.layer.cornerRadius = 6;
        testView.layer.masksToBounds = YES;
註意,需要 import <QuartzCore/QuartzCore.h> 導入,否則,不能識別cornerRadius和masksToBounds。 
uiview設置背景圖片:

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

imageName 緩存,下麵方法不緩存

1 NSString *thePath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"jpeg"];
2 UIImage *prodImg = [[UIImage alloc] initWithContentsOfFile:thePath"];  
3 controller.productImg.image = prodImg;   
4 [prodImg release]; 

7、隱藏鍵盤的兩種方法  

 1-1Did End On Exit 調用下麵事件當點擊鍵盤return得時候就會隱藏鍵盤

 1 - (IBAction)textFieldShouldReturn:(UITextField *)textField {
 2     //[sender resignFirstResponder];
 3     if (textField == chi) {
 4         [chi resignFirstResponder];
 5         double m=[chi.textdoubleValue]/3.003;
 6         double f=m *3.2808;
 7         meter.text=[[NSStringalloc] initWithFormat:@"%.4f",m];
 8         feet.text=[[NSStringalloc] initWithFormat:@"%.4f",f];
 9     }
10     if (textField == meter) {
11         [meter resignFirstResponder]; 
13     }
14     if (textField == feet) {
15         [feet resignFirstResponder];
16     }
17 }

 

1-2 點擊屏幕得時候隱藏鍵盤

1 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
2     UITouch *touch=[[event allTouches] anyObject];
3     if (touch.tapCount >=1) {
4         [chi resignFirstResponder];
5         [meter resignFirstResponder];
6         [feet resignFirstResponder];
7     }
8 }

1-2 的方法相當於屏幕任何位置的點擊事件(除了各組件的點擊處)可以在這個方法里執行要隱藏或remove的view。

1-3 隱藏鍵盤 方法二

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
   [self.view endEditing:YES]; 
}

 

8、UITextField密文顯示輸入內容: 



只需要在TextField屬性中的Secure(安全的)勾選上或者設置 passWordTextField.secureTextEntry=YES; 就可以了。顯示apple預設的密文顯示方式。 

 

9、通過系統自帶的NSPredicate使用正則表達式。(在TextField中) 

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

10、項目設置應用程式顯示名稱:   

1, 在項目的Supporting Files下尋找infoPlist.strings文件,打開後會看到一片空白(英文預設是跟隨項目名稱顯示)。此時,可以就地添加一句代 碼:CFBundleDisplayName="愛貝通";這樣的話,無論手機設置英文語言還是中文語言,應用程式都會顯示設置的名稱。

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



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

然後打開添加代碼:


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

 

11、更改Xcode的預設公司名 

1 //  testAppDelegate.m    
2 //  test    
3 //    
4 //  Created by gaohf on 11-5-24.    
5 //  Copyright 2011 __MyCompanyName__. All rights reserved.  

 在終端中執行以下命令: 

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

 

執行後效果

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

 

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

只需要在要添加view時侯這樣寫:
 [[UIApplication sharedApplication].keyWindow addSubview:waitingview];   

這樣,直接把waitingview添加到了uiWindow上,而不是self.view上。再次運行,會發現屏幕全部區域都已經遮擋住了。

 

13、 使用了storyboard,運行程式模擬器顯示黑屏,這是由於,操作不當,獲取點擊了例如  navigationViewController屬性種的in init ViewController選項,然後重置了當前進入程式後的首界面,解決辦法就是選擇入口界面,屬性種重新勾選此選項。   

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

14、如何給uiNavigationBar 設置背景顏色或是自定義圖片?   

在項目中添加如下代碼: 
//設置背景顏色:

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

//設置自定義的圖片:

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

5.0以上,api有了上面setBackgroundImage的方法,可以直接設置,如果項目需要適配5.0以下版本的設備,最好加一個判讀,是否有此函數,有則設置,沒有就通過drawRect方法設置。 
另外:設置背景圖片無法匹配backButton或rightButtonItem,所以返回按鈕或右邊自定義的Bar button Item需要自行處理。

 

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

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

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

這樣,背景就可以變成想要的圖片了。另外,設置大小:
 [leftNaviView setFrame:CGRectMake(9, 60, 120, 250)];   

效果圖:
 

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]];  

把以上代碼直接拷貝到想要實現點擊跳轉的操作方法內就可以了,通過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,跳轉到系統設置相關界面

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

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

若需要傳遞內容可以做如下操作:

 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 }  

發送郵件的為:  

 1 //導入MFMailComposeViewController
 2 #import <MessageUI/MFMailComposeViewController.h>  
 3 //實現代理:MFMailComposeViewControllerDelegate  
 4    
 5 //發送郵件  
 6 -(void)sendMail:(NSString *)subject content:(NSString *)content{  
 7   MFMailComposeViewController *controller = [[[MFMailComposeViewController alloc] init] autorelease];  
 9     if([MFMailComposeViewController canSendMail])   
11     {   
13         [controller setSubject:subject];    
15         [controller setMessageBody:content isHTML:NO];    
17         controller.mailComposeDelegate = self;   
19         [self presentModalViewController:controller animated:YES];   
21     }      
22 }  
23    
24 //郵件完成處理  
25 -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{  
27     [self dismissModalViewControllerAnimated:YES];   
29     if (result == MessageComposeResultCancelled)  
30         NSLog(@"Message cancelled");  
31     else if (result == MessageComposeResultSent)  
32         NSLog(@"Message sent");   
33     else   
34         NSLog(@"Message failed");    
35    
36 }  
37    

預設發送簡訊的界面為英文的,解決辦法為:在.xib 中的Localization添加一組chinese   

 

18、註冊設置應用程式訪問用戶手機發送推送消息,(彈出Alertview)   

1 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
2      (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 

19、輕鬆自定義覆選框按鈕 

 1 -(void)checkboxClick:(UIButton *)btn
 2 {
 3     btn.selected = !btn.selected;
 4 }
 5  
 7 - (void)viewDidLoad {
 8 UIButton *checkbox = [UIButton buttonWithType:UIButtonTypeCustom]; 
10     CGRect checkboxRect = CGRectMake(135,150,36,36);
11     [checkbox setFrame:checkboxRect];
12     
13     [checkbox setImage:[UIImage imageNamed:@"checkbox_off.png"] forState:UIControlStateNormal];
14     [checkbox setImage:[UIImage imageNamed:@"checkbox_on.png"] forState:UIControlStateSelected];
15     
16     [checkbox addTarget:self action:@selector(checkboxClick:) forControlEvents:UIControlEventTouchUpInside];
17 [self.view addSubview:checkbox];    
18 } 

 

20、程式中獲取軟體的版本號和app名稱  

應用程式的名稱和版本號等信息都保存在mainBundle的infoDictionary字典中,用下麵代碼可以取出來。  

1 NSDictionary* infoDict =[[NSBundle mainBundle] infoDictionary];  
2 NSString* versionNum =[infoDict objectForKey:@"CFBundleVersion"];//版本名稱  
3 NSString*appName =[infoDict objectForKey:@"CFBundleDisplayName"];//app名稱  

 

1 <p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Menlo;">
2 <span style="color: #703daa">NSString</span> 
3 * versionShortString = [infoDict <span style="color: rgb(61, 29, 129);">objectForKey</span>:
4 <span style="color: #d12f1b">@"CFBundleShortVersionString"</span>];//標識應用程式發佈版本號
5 </p>
6 NSString*text =[NSString stringWithFormat:@"%@ %@",appName,versionNum,
7 <span style="font-family: Menlo; font-size: 11px; white-space: pre; ">versionShortString</span>];  

此version 為工程info下的Bundle version欄位值:value可以隨意定義。
CFBundleVersion,標識(發佈或未發佈)的內部版本號。這是一個單調增加的字元串,包括一個或多個時期分隔的整數。
CFBundleShortVersionString  標識應用程式的發佈版本號。該版本的版本號是三個時期分隔的整數組成的字元串。第一個整數代表重大修改的版本,如實現新的功能或重大變化的修訂。第二個整 數表示的修訂,實現較突出的特點。第三個整數代表維護版本。該鍵的值不同於“CFBundleVersion”標識。
   圖片里的 Version 對應的就是CFBundleShortVersionString (發佈版本號 如當前上架版本為1.1.0  之後你更新的時候可以改為1.1.1)
   Build 對應的是 CFBundleVersion(內部標示,用以記錄開發版本的,每次更新的時候都需要比上一次高 如:當前版本是11  下一次就要大於11 比如 12,13 ....10000) 

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

比如,如果我們做一個播放視頻的功能時,想在播放的時候,不會自動進入屏保(黑屏)
只要在代碼裡加入這一行:
 [[UIApplication sharedApplication] setIdleTimerDisabled:YES];  
 
 當然,在想要黑屏的時候還需要把它設置為NO(比如視頻播放完畢時),不然屏幕會在此軟體運行下一直亮著。 

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

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

 

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

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

UIInterfaceOrientationLandscapeLeft

UIInterfaceOrientationLandscapeRight

UIInterfaceOrientationPortrait

UIInterfaceOrientationPortraitUpsideDown

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

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

具體見下圖:



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

1 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
2 {  
3     //除了不允許旋轉屏幕後:上下顛倒,其餘方向都運行旋轉  
4     //如果想都運行,可以直接返回YES,或都不允許NO  
5     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
6       
7 }  

這 個方法是聲明此ViewController所運行屏幕旋轉的方向,一共4種類型,全部允許返回YES,上圖所示除了不允許上下顛倒,其餘都可以。【註 意,項目設置Supported Device Orientations 所支持的屏幕旋轉類型並不影響此方法的設置,也就是說,哪怕Support只支持Portrait,方法里設置UpsideDown,此 ViewController也會實現上下顛倒旋轉的】

第二個方法,是我們比較常用的,也就是在設備即將以某個方向旋轉之前,我們在其狀態(方向)設置組件或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 }  

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

【註意,以上兩個方法,在最新的ios6貌似已經不提倡使用了,除非要適應舊設備,新的旋轉屏幕的相關方法可以網路搜索一下】

http://blog.csdn.net/zzfsuiye/article/details/8251060  IOS6屏幕旋轉詳解(自動旋轉、手動旋轉、相容IOS6之前系統)
http://blog.csdn.net/huifeidexin_1/article/details/7826159  ios旋轉屏幕總結 詳細教程
http://blog.csdn.net/xiaoyun8822/article/details/8213738 Ios5(三)屏幕的旋轉和大小設置;
以上為參考教程 

 

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

1 Application windows are expected to have a root view controller at the end of application launch解決方法:在ios5以上版本,應用程式載入時,需要一個 root view controller ,所以需要編寫代碼_rootViewController = [[RootViewController alloc] init];self.window.rootViewController = _rootViewController;此問題大多是在Xib或Storyboard下操作ViewController時不小心連接 RootViewController 的底層View所導致的,檢查刪除沒有作用的view連接線,或是Clean (Command+Shift+K),再運行。

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: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 } 

 

 

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

1、實現UITextFieldDelegate協議;  
2、實現textField:shouldChangeCharactersInRange:replacementString:方法;

1  -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{  
2     int kMaxLength = 11;  
3  
4     NSInteger strLength = textField.text.length - range.length + string.length;  
5     //輸入內容的長度 - textfield區域字元長度(一般=輸入字元長度)+替換的字元長度(一般為0)  
6     return (strLength <= kMaxLength);
7 
8 }  

如上代碼,如果我們簡單的這樣寫: 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   

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

29、iOS和iPad各app圖標和啟動頁尺寸。  

iphone APP圖標尺寸:57X57    高清:114X114  單位:pixel   命名:無特殊要求,最好是,app_icon  高清的要加@2x

iphone 啟動頁尺寸:大小最好是320X460或320X480(相當於整個屏幕尺寸) 單位:pixel 命名:Default.png

iPad APP圖標尺寸:72X72 高清:144X144  單位:pixel 命名:

ipad 啟動頁尺寸:大小最好是768X1004或768X1024  單位:pixel 命名:Default-Portrait~ipad.png   高清:Default-Portrait@2x~ipad.png

 

30、如何用NSLog輸出NSRange,CGRect等結構體。   

NSString 中的方法: 
NSStringFromCGPoint   
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform   
NSStringFromUIEdgeInsets  
如:NSLog(@"rect1: %@", NSStringFromCGRect(rect1)); 

 

31、如何在navigationviewcontroller中,pop到之前不同的viewcontroller(push過的viewcontroller)?  


如上圖所示,回退到界面2,很簡單:  [self.navigationControllerpopViewControllerAnimated:YES];  直接就回退到界面2了,可是我們既不想回到rootviewcontroller,

也不想回到界面2,只想回到界面1,該如何做? 
笨方法:在界面1要跳轉到界面2時,把自己self,set到界面2(前提界面2要設置一個id類型的屬性,用來存放界面1self,以此類推,當在界面3想退到界面1時, 
[self.navigationControllerpopToViewController:controlleranimated:YES]; 
其實現在剛明白,一個很簡單的方法:

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

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

這不就解決問題了麽?
 [self.navigationController popToViewController:controller animated:YES];   

【註意】千萬不要在這個地方實例化 界面1 然後popToViewController,這種方法是不對的。  

 

32、self.navigationItem.backBarButtonItem 的title設置   

新寫的App中需要使用UINavigationController對各個頁面進行導航,但由於第一級頁面的title較長,在進入第二級頁面後返回按鈕leftButtonItem的title就會變得很長,

對NavigationBar空間占用很大,而且不美觀,於是使用代碼對leftButtonItem的title文本進行修改,無論是設置self.navigationItem.leftBarButtonItem.title = @"返回";還是self.navigationItem.backBarButtonItem.title = @"返回";都沒有效果,title文本始終不會發生變化。到網上亂搜一通後,得到了以下解決方法,相對來說比較簡單,特記錄如下:
在第一級頁面的viewDidLoad方法中加入以下代碼: 

1 UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];  
2  temporaryBarButtonItem.title =@"返回
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS3新增的動畫幀非常絢麗,可以簡單實現一些動畫效果,目前除IE外各大主流瀏覽器都支持 本文演示三個:transform: scale3d(x, y, z)-縮放;、transform: translate3d(x, y, z)-位移;、transform:rotateX/Y(?deg)-旋轉; ...
  • 一、元素選擇器 HTML文檔元素就是最基本的選擇器 如: 示例將<p>元素的字體顏色設置為了藍色,元素選擇器將作用於文檔內所有的<p>元素。同樣,我們也能夠同時為多個元素應用一種樣式,如: 為多個元素應用樣式時,用逗號分隔。 *作為通配選擇器,可以與任何元素匹配。 格式:元素|通配符 二、類選擇器 ...
  • 所謂的瀏覽器相容性問題,是指因為不同的瀏覽器對同 段代碼有不同的解析,造成 顯 效果不統 的情況。在 多 數情況下,我們的需求是, 論 戶 什麼瀏覽器來查看我們的 站或者登陸我們的系統,都應該是統 的顯 效果。所 以瀏覽器的相容性問題是前端開發 員經常會碰到和必須要解決的問題。 在學習瀏覽器相容性之 ...
  • 有話先說:本文的目的主要是向大家描述一下我們在遇見IE8版本一下以及Firefox相容的問題。 針對不同的瀏覽器寫不同的CSS的過程,這就叫CSS hack,也叫寫CSS hack,相信您會對一些比較不易解決的相容問題有一定的興趣。 註意點: 網上很多資料中常常把!important也作為 個hac ...
  • 效果預覽:http://hovertree.com/texiao/js/22/效果圖:代碼如下: 轉自:http://hovertree.com/h/bjaf/meihua.htm 推薦:http://hovertree.com/h/bjaf/h9tb5itb.htm 更多特效:http://www ...
  • 我們知道刪除一個dom節點的時候索引就會發生了改變,甚至是錯誤,就算jq的ecah也無能為力,所以我們只能自己寫個功能了 直接上代碼把,不多說 <!DOCTYPE html> <html> <head> <title>fancyBox - Fancy jQuery Lightbox Alternat ...
  • public void onClick(View arg0) { Intent intent = new Intent(); intent.setClass(getActivity(), CaptureActivity.class); getActivity().startActivity(inte ...
  • ★懶載入即延時載入,即當對象需要用到的時候再去載入。其實就是重寫對象的get方法,當系統或者開發者調用對象的get方法時,再去載入對象。 ★註意: 1. 如果是懶載入的話則一定要註意先判斷是否已經有了,如果沒有那麼再去進行實例化 2. 在getter方法里切勿使用self.自己,因為self.自己會 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...