其實在代碼裏仍是能夠設置的,那就是刪除背景viewphp
[[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];html
[注意]在開發中,若是使用年月日,用NSDateFormatter setFormat :@"yyyy-MM-dd",若是是使用小時和分鐘,設置爲:"HH:mm",切記不要設置「HH-mm」,這樣會出錯的。java
舉例:ios
若是使用 UTTabviewCell,設置其accessory樣式爲:Detail Disclosure ,就是在每個cell右邊設置一個detail button。若是這樣的操做是使用storyboard,進行的,它會要求你給每個你cell設置indentifier,而後你會在如下方法內設置重用indentfier,別忘記加上一句話,不然編譯運行時可能會彈出: cell未實例化c++
在開發項目中,有時有這樣的需求:運行程序,登錄界面是一個自由的ViewController,只是擺放幾個TextField和button,點擊後跳轉到其它選擇界面,點擊選項後進入咱們的主界面:這個時候,在登錄界面做跳轉時,會有好多的方法,若是使用storyboard,就比較方便了,設置一個segue,跳轉代碼中git
[self PerformSegueWithIdentifier:@"targetViewController",self]; 就能夠了,但是我想實例化想要跳轉的控制器,而後設置某一屬性的值,這樣跳轉後控制器獲取那個屬性,就會獲得值了,但是這樣作會有一個問題:正則表達式
主界面控制器若是使用了navigatorViewController,而且是其RootViewController,等到在主界面設置功能,點擊某一功能,想push到一個新頁面時,問題就來了,你會發現毫無反應,沒有報錯,只是segue沒法跳轉。後來終於找到緣由:就是我在登錄控制器跳轉時沒有使用segue的方法,而是用代碼self.storyboard,加載一個新類,具體原理目前尚未搞明白,先把出問題的代碼記錄下來,回頭補之:算法
代碼這樣作,會致使其後沒法使用navigatorViewController作push跳轉編程
開發過程當中,咱們經過http請求,後臺返回json數據,而有時數據裏某一字段的值爲null~,而後咱們把此值賦值給NSArray,NSdictionary,或是NSString,而後咱們會判斷此值爲null時,所作的處理,而一般慣性思惟判斷時咱們都會寫:if(dict == nil)或是if(dict == Nil)或是if(dict == NULL)再或是if(dict isEqual nil),咱們發現,都很差用,根本沒有起到判斷的做用~後來我才發現,原來不能這樣來判斷。json
簡單點說,就是當字典,數組爲null時,後臺打印的輸出結果是這樣:
而後,咱們須要在代碼判斷時利用[NSNull null]來判斷,具體如:
isEqual:[NSNull null] 就搞定了,nsarray也是一樣的道理。
控制檯打印:str=(null) 表明着 字符串或數組或字典是一個空指針,(而非空字符串)判斷的時候,直接用:
if(str == nil)就能夠了。以下圖所示:
而控制檯打印:str = <null>,表明着這是一個空字符串,賦值爲空,指針是存在的,只是內容爲空,這種判斷須要使用:
if(str is equal [NSNull null ]) ,由於在ios上,內容爲空不能簡單的判斷str==null(null 在ios上得用[NSNull null])
通常這種狀況是,服務器那邊是null,直接返回@"null"的字符串,這樣在ios這邊很差判斷,最好跟後臺溝通,若是遇到null值,返回@"",好作判斷
只需在加載時,添加這樣的話就能夠了:
testView.layer.cornerRadius = 6;
testView.layer.masksToBounds = YES;
注意,須要 import <QuartzCore/QuartzCore.h> 導入,不然,不能識別cornerRadius和masksToBounds。
uiview設置背景圖片:
[theMainView setBackgroundColor: [UIColor colorWithPatternImage: [UIImage imageNamed: @"bg.png"]]];
imageName 緩存,下面方法不緩存
NSString *thePath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"jpeg"];
UIImage *prodImg = [[UIImage alloc] initWithContentsOfFile:thePath"];
controller.productImg.image = prodImg;
[prodImg release];
7,隱藏鍵盤的兩種方法
1-1Did End On Exit 調用下面事件當點擊鍵盤return得時候就會隱藏鍵盤
- (IBAction)textFieldShouldReturn:(UITextField *)textField {
//[sender resignFirstResponder];
if (textField == chi) {
[chi resignFirstResponder];
double m=[chi.textdoubleValue]/3.003;
double f=m *3.2808;
meter.text=[[NSStringalloc] initWithFormat:@"%.4f",m];
feet.text=[[NSStringalloc] initWithFormat:@"%.4f",f];
}
if (textField == meter) {
[meter resignFirstResponder];
}
if (textField == feet) {
[feet resignFirstResponder];
}
}
1-2 點擊屏幕得時候隱藏鍵盤
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[[event allTouches] anyObject];
if (touch.tapCount >=1) {
[chi resignFirstResponder];
[meter resignFirstResponder];
[feet resignFirstResponder];
}
}
1-2的方法至關於屏幕任何位置的點擊事件(除了各組件的點擊處)能夠在這個方法裏執行要隱藏或remove的view。
只須要在TextField屬性中的Secure(安全的)勾選上就能夠了。顯示apple默認的密文顯示方式。
1,在項目的Supporting Files下尋找infoPlist.strings文件,打開後會看到一片空白(英文默認是跟隨項目名稱顯示)。此時,能夠就地添加一句代碼:CFBundleDisplayName="愛貝通";
這樣的話,不管手機設置英文語言仍是中文語言,應用程序都會顯示設置的名稱。
2,爲了國際化而言,咱們最好建立一個chinese專有的infoPlist.strings文件。
如上圖所示,添加一箇中文的plist
而後打開添加代碼:
這個時候,大功告成。部署在模擬器或真機中吧,你的手機設置(中/英)文語言,它就會調用相應的配置文件。
只須要在要添加view時侯這樣寫:
這樣,直接把waitingview添加到了uiWindow上,而不是self.view上。再次運行,會發現屏幕所有區域都已經遮擋住了。
這是因爲,操做不當,獲取點擊了例如 navigationViewController屬性種的in init ViewController選項,而後重置了當前進入程序後的首界面,解決辦法就是選擇入口界面,屬性種從新勾選此選項。
StoryboardApp[8593:207] Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?
StoryBoard中沒有一個view controller設置了Initial Scene。您須要選擇一個view conroller做爲story board的第一個界面:
在項目中添加以下代碼:
//設置背景顏色:
另外:設置背景圖片沒法匹配backButton或rightButtonItem,因此返回按鈕或右邊自定義的Bar button Item須要自行處理。
在storyboard或xib中,添加一個uiview,屬性設置欄通常都有設置背景顏色,樣式,透明度alpha,可是沒有提供設置image,只有在imageview中才有,因此,要想設置背景圖片,只能在代碼中設置,以下:
效果圖:
在相應的代碼中寫入:
一、調用 電話phone
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://4008008288"]];
二、調用自帶 瀏覽器 safari
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.abt.com"]];
三、調用 自帶mail
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@abt.com"]];
四、調用 SMS
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];
5,跳轉到系統設置相關界面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];
其中,發短信,發Email的功能只能填寫要發送的地址或號碼,沒法初始化發送內容,若是想實現內容的話,還須要更復雜一些,實現其各自的委託方法。
若須要傳遞內容能夠作以下操做:
加入:MessageUI.framework
#import <MessageUI/MFMessageComposeViewController.h>
實現代理:MFMessageComposeViewControllerDelegate
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
-(void)checkboxClick:(UIButton *)btn
{
btn.selected = !btn.selected;
}
- (void)viewDidLoad {
UIButton *checkbox = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect checkboxRect = CGRectMake(135,150,36,36);
[checkbox setFrame:checkboxRect];
[checkbox setImage:[UIImage imageNamed:@"checkbox_off.png"] forState:UIControlStateNormal];
[checkbox setImage:[UIImage imageNamed:@"checkbox_on.png"] forState:UIControlStateSelected];
[checkbox addTarget:self action:@selector(checkboxClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:checkbox];
}
CFBundleVersion,標識(發佈或未發佈)的內部版本號。這是一個單調增長的字符串,包括一個或多個時期分隔的整數。
CFBundleShortVersionString 標識應用程序的發佈版本號。該版本的版本號是三個時期分隔的整數組成的字符串。第一個整數表明重大修改的版本,如實現新的功能或重大變化的修訂。第二個整數表示的修訂,實現較突出的特色。第三個整數表明維護版本。該鍵的值不一樣於「CFBundleVersion」標識。 圖片裏的 Version 對應的就是CFBundleShortVersionString (發佈版本號 如當前上架版本爲1.1.0 以後你更新的時候能夠改成1.1.1)
Build 對應的是 CFBundleVersion(內部標示,用以記錄開發版本的,每次更新的時候都須要比上一次高 如:當前版本是11 下一次就要大於11 好比 12,13 ....10000)
好比,若是咱們作一個播放視頻的功能時,想在播放的時候,不會自動進入屏保(黑屏)
只要在代碼里加入這一行:
表示在版本控制中,自上一次提交以來,文件作了修改。貌似只有在帶有版本控制的項目代碼中才會顯示,也就是說你的項目使用了SVN、GIT等工具後,會在Xcode中識別出來。
'A' 新增
'D' 刪除
'M' 修改
'R' 替代
'C' 衝突
'I' 忽略
'?' 未受控
'!' 丟失,通常是將受控文件直接刪除致使
屏幕旋轉一共有4個相關屬性(旋轉方向):
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
前兩個是橫屏時的狀態,後兩個是正常狀態(Portrait)和上下顛倒(UpsideDown)時的狀態。
【注意:Left和Right兩個左右模擬器旋轉時移動的方向正好是相反的,但移動後Home的方向,就以下圖所示】
具體見下圖:
其中涉及到兩個方法,在ViewController中默認會實現這個方法:
第二個方法,是咱們比較經常使用的,也就是在設備即將以某個方向旋轉以前,咱們在其狀態(方向)設置組件或view的Frame,bound,等須要改變的屬性時所用到的方法。
全部旋轉屏幕後須要改變組件尺寸屬性的設置均可以在這個方法裏面實現。
【注意,以上兩個方法,在最新的ios6貌似已經不提倡使用了,除非要適應舊設備,新的旋轉屏幕的相關方法能夠網絡搜索一下】
http://blog.csdn.net/zzfsuiye/article/details/8251060 IOS6屏幕旋轉詳解(自動旋轉、手動旋轉、兼容IOS6以前系統)
http://blog.csdn.net/huifeidexin_1/article/details/7826159 ios旋轉屏幕總結 詳細教程
http://blog.csdn.net/xiaoyun8822/article/details/8213738 Ios5(三)屏幕的旋轉和大小設置;
以上爲參考教程
1 Application windows are expected to have a root view controller at the end of application launch
解決方法:在ios5以上版本,應用程序加載時,須要一個 root view controller ,因此須要編寫代碼
_rootViewController = [[RootViewController alloc] init];
self.window.rootViewController = _rootViewController;
此問題大可能是在Xib或Storyboard下操做ViewController時不當心鏈接RootViewController 的底層View所致使的,檢查刪除沒有做用的view鏈接線,或是Clean,再運行。
情景再現:
咱們在storyboard的一個視圖裏添加了一個view1用做快捷功能導航;而後在對應的viewController裏實例化了一個Mapview的地圖view2,大小是整個屏幕,這樣一來,就把咱們在storyboard中添加的view1覆蓋了,這個時候,咱們想把view1在地圖view2的上面,該怎麼作?
簡而言之就是window中subview的交換。
首先經過:NSLog(@"subviews:%@",self.view.subviews); 這個咱們能夠看到當前下全部的subview(NSArray類型)以下圖所示:
能夠看到一共有3個view:UILabel 地圖view2,添加的view1
咱們如今要作的就是把後二者對調一下,因此在self.view 中尋找一下看有沒有replace相關的方法
就是這個方法,第一個參數是要進行調換的地圖view2,第二個參數是調換後顯示的view1。
[self.viewexchangeSubviewAtIndex:1withSubviewAtIndex:2];
由於經過log打印,咱們已經知道Mapview在第一個下標的位置,view1在第二個下標的位置。大功告成。記住這個方法:self.view exchangeSubviewAtIndex:withSubviewAtIndex:];
有的時候,咱們的視圖使用了Navigation Controller ,可是主界面(rootviewcontroller)或其它push進入的界面 想使用一個全屏的view,就是說,不顯示頂部的navigationBar,這個時候,就須要咱們來隱藏了。
//隱藏NavigationBar
-(void) viewWillAppear:(BOOL)animated{
[self.navigationControllersetNavigationBarHidden:YESanimated:YES]; //設置隱藏
[super viewWillAppear:animated];
}
-(void) viewWillDisappear:(BOOL)animated{
[self.navigationControllersetNavigationBarHidden:NOanimated:YES];
[super viewWillDisappear:animated];
}
一、實現UITextFieldDelegate協議;
二、實現textField:shouldChangeCharactersInRange:replacementString:方法;
如上代碼,若是咱們簡單的這樣寫: if(range.location<=11) return 或是 if (textfield.text.length>=11) 這樣雖然也能限制位數爲11位,可是若是經過放大鏡把光標切換到以前的位數後,你照樣能夠輸入,而且還會致使輸入11位後,鍵盤上的退格(X鍵)沒法使用,緣由是:咱們在location到達11位後,返回了NO,鍵盤沒法相應:添加,修改,刪除。這是很嚴重的。因此照着我上面的。
方法解讀:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
功能:
把textField中位置爲range的字符串替換爲string字符串;
此函數在textField內容被修改時調用;
返回值:
YES,表示修改生效;NO,表示不作修改,textField的內容不變。
參數說明:
textField:響應UITextFieldDelegate協議的UITextField控件。
range: UITextField控件中光標選中的字符串,即被替換的字符串;
range.length爲0時,表示在位置range.location插入string。
string: 替換字符串; string.length爲0時,表示刪除。
29,iOS和iPad各app圖標和啓動頁尺寸
iphone APP圖標尺寸:57X57 高清:114X114 單位:pixel 命名:無特殊要求,最好是,app_icon 高清的要加@2x
iphone 啓動頁尺寸:大小最好是320X460或320X480(至關於整個屏幕尺寸) 單位:pixel 命名:Default.png
iPad APP圖標尺寸:72X72 高清:144X144 單位:pixel 命名:
ipad 啓動頁尺寸:大小最好是768X1004或768X1024 單位:pixel 命名:Default-Portrait~ipad.png 高清:Default-Portrait@2x~ipad.png
NSString 中的方法:
NSStringFromCGPoint
NSStringFromCGSize
NSStringFromCGRect
NSStringFromCGAffineTransform
NSStringFromUIEdgeInsets
如:NSLog(@"rect1: %@", NSStringFromCGRect(rect1));
如上圖所示,回退到界面2,很簡單: [self.navigationControllerpopViewControllerAnimated:YES]; 直接就回退到界面2了,但是咱們既不想回到rootviewcontroller,也不想回到界面2,只想回到界面1,該如何作?
笨方法:在界面1要跳轉到界面2時,把本身self,set到界面2(前提界面2要設置一個id類型的屬性,用來存放界面1self,以此類推,當在界面3想退到界面1時,
[self.navigationControllerpopToViewController:controlleranimated:YES];
其實如今剛明白,一個很簡單的方法:
想起來navigation的機制了吧,每當咱們push到一個viewcontroller時,就會把這個viewcontroller的實例保存到nsarray裏,經過array能夠獲取到任何一個viewcontroller,這不就解決問題了麼?
新寫的App中須要使用UINavigationController對各個頁面進行導航,但因爲第一級頁面的title較長,在進入第二級頁面後返回按鈕leftButtonItem的title就會變得很長,對NavigationBar空間佔用很大,並且不美觀,因而使用代碼對leftButtonItem的title文本進行修改,不管是設置self.navigationItem.leftBarButtonItem.title = @"返回";仍是self.navigationItem.backBarButtonItem.title = @"返回";都沒有效果,title文本始終不會發生變化。到網上亂搜一通後,獲得瞭如下解決方法,相對來講比較簡單,特記錄以下:
在第一級頁面的viewDidLoad方法中加入如下代碼:
---------------------------------------------------------------------------------------------------------
通常一個程序中有一個UIWindow,一個UINavigationController,一個根UIViewController,多個子UIViewController。
UIWindow是整個可視界面的容器,裏面放置咱們看到的UIView。
UIView負責處理屏幕上一個矩形區域的繪製,UIView中還可包含子UIView。
UIWindow是UIView類的擴展,能夠看做是整個屏幕的根UIView。
UIViewController負責管理UIView的層次結構。能夠有多個UIViewController。
一個UIViewController中有一個頂部的UINavigationBar、一個根UIView,多個子UIView。
UINavigationBar中有一個UINavigationItem,UINavigationItem。
UINavigationController是用於構建分層應用程序的主要工具,它維護了一個UIViewController棧。
這個棧中必須有一個根UIViewController,其餘的UIViewController都是子UIViewController。
UINavigationItem表示UINavigationBar中的控件,好比左按鈕、中間標題、右按鈕。
UINavigationController會自動在當前子UIViewController的UINavigationBar左邊添加一個返回按鈕。
按鈕名稱是上一個UIViewController的標題。
/**********************************************/
self.navigationItem
self.navigationController.navigationItem
self.navigationController.navigationBar
/**********************************************/
1, 不要混淆 self.navigationItem 和 self.navigationController.navigationItem ,
UINavigationItem 自己是用來 定製 ViewController本身在被導航過程當中的 appearence, navigationItem是UIViewController類關於UINavigationControllerItem類別的擴展:
@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain)UINavigationItem * navigationItem;
...
@end
因此後者 是調用 VC的所在的導航控制器導航控制器本身本身做爲VC的 navigationItem,是導航的疊加。
2. UINavigationBar 繼承於 UIView,隸屬於整個 UINavigationController ,用來定義整個導航過程當中的導航欄的顏色等其餘數值,(相似於 self.tabBarController.tabBar UINavigationBar ,只須要一個設置通用的基本屬性),只能經過self.navigationController.navigationBar來訪問。
亦所以,定製於導航堆棧裏某個VC 的時候,通常經過self.navigationItem, 好比經常使用的self.navigationItem.leftBarButtonItem,self.navigationItem.rightButtonItem, 同時若是本身來定製導航欄的外觀的話,就要用到self.navigationItem.titleView,這個能夠直接用一個 CustomView 賦值於 self.navigationItem.titleView便可。
此時,若是須要,就得本身畫導航過程當中的返回按鈕了。
iOS 6中NSString對象有些新的使用方法,可讓字符串轉變成所有大寫,所有小寫,或者每一個單詞首字母大寫。
代碼以下所示:
經過使用UIDevice:
[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];//os version
[[UIDevice currentDevice] uniqueIdentifier];
[[UIDevice currentDevice] model];
[[UIDevice currentDevice] name];
真機上結果:
System Name: iPhone OS
System Version: 4.2.1
Unique ID: 9b5ded78d5fa0ac96250f8b4af0e46f40b96ea6d
Model: iPhone
Name: 「wwk」的 iPhone
模擬器上結果:
System Name: iPhone OS
System Version: 4.2
Unique ID: 21FFE0FF-429B-5D0B-96D2-EADCA3203260
Model: iPhone Simulator
Name: iPhone Simulator
uniqueIdentifier:iPhone經過,向幾個硬件標識符和設備序列號應用內部散列算法,而生成這一標識符。
http://blog.csdn.net/qiwancong/article/details/7914923 參考
雖然更改了新demo的bundle identifier和以前的identifier同樣,可是真機上還保留着以前調試時的demo,因此新的工程若是使用一樣的identifier真機調試,須要先把機器上原來的demo刪除,再使用新工程調試。
在須要判斷屏幕尺寸的地方:
iphone5的View爲568,減去Nav(44)+任務欄(20),爲504,相比iphone4s及之前版本的480,減去Nav+任務欄,爲416,高出88(差異).
http://www.cnblogs.com/maxfong/archive/2012/10/04/2711379.html
選中項目--target---build settings 找到C++Standard Library 改爲:Compiler Default,再編譯就不會有錯誤了.
首先要在工程里加入Audio Toolbox framework這個庫,而後在須要調用的文件裏
#import <AudioToolbox/AudioToolbox.h>
最後在須要播放提示音的地方編寫以下代碼:
AudioServicesPlaySystemSound(1000);//新郵件消息提示
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震動
注:括號中爲系統聲音的id,詳見請參考如下網址http://iphonedevwiki.net/index.php/AudioServices。
http://blog.csdn.net/tskyfree/article/details/8096500
http://www.cnblogs.com/martin1009/archive/2012/06/14/2549473.html
http://www.cnblogs.com/chen1987lei/archive/2012/02/07/2341535.html
最好不要在UIViewController的loadView方法中改變狀態欄的可視性(好比狀態欄由顯示變爲隱藏、或者由隱藏變爲顯示),由於會致使重複調用2次loadView和viewDidLoad方法。
1 2013-05-14 00:51:36.152 test[2251:c07] loadView 2 2013-05-14 00:51:36.153 test[2251:c07] loadView 3 2013-05-14 00:51:36.153 test[2251:c07] viewDidLoad 4 2013-05-14 00:51:36.154 test[2251:c07] viewDidLoad
雖然運行效果是對的,可是系統連續調用了2次loadView和viewDidLoad方法,致使建立了2次UIView,形成了沒必要要的開銷。
緣由分析:
狀態欄由顯示變爲隱藏,意味着屏幕的可用高度變長了,UIViewController的UIView的高度也要從新調整,所以系統會從新調用loadView方法建立UIView,建立完畢後再次調用viewDidLoad方法。
若是在UIImageView中添加了一個按鈕,你會發如今默認狀況下這個按鈕是沒法被點擊的,須要設置UIImageView的userInteractionEnabled爲YES:
imageView.userInteractionEnabled = YES;
設置爲YES後,UIImageView內部的按鈕就能夠被點擊了
大部分app在啓動過程當中全屏顯示一張背景圖片,好比新浪微博會顯示這張:
要想在iOS中實現這種效果,毫無壓力,很是地簡單,把須要全屏顯示的圖片命名爲Default.png便可,在iOS app啓動時默認會去加載並全屏顯示Default.png。
也能夠用其餘名稱來命名圖片,在Info.plist配置一下便可:
配置事後,app啓動時就會去加載並全屏顯示lufy.png
在默認狀況下,app顯示Default.png時並不是真正的"全屏顯示",由於頂部的狀態欄並無被隱藏,好比下面的效果:
大部分狀況下,咱們都想隱藏狀態欄,讓Default.png真正全屏顯示。
說到這裏,可能有人立刻就想到了一種辦法:在AppDelegate的application:didFinishLaunchingWithOptions:方法中添加以下代碼:
[UIApplication sharedApplication].statusBarHidden = YES;
我只能說你的思路是對的,但實際上達不到想要的效果,你會發現顯示Default.png時狀態欄仍是存在的,等Default.png顯示完畢後,狀態欄才被隱藏。
我先解釋下爲何這種方法不可行,其實緣由很簡單:
1> Default.png是在app啓動過程當中加載的,並非在app啓動完畢後再加載的
2> AppDelegate的application:didFinishLaunchingWithOptions:方法是在app啓動完畢後才調用的
下面說一下解決方案,在Info.plist中增長一個配置便可:
這裏的YES表示在app初始化(啓動)的時候就隱藏狀態欄。
固然,在Default.png顯示完畢後狀態欄仍是隱藏的。若是想從新顯示狀態欄,補上下面代碼便可:
[UIApplication sharedApplication].statusBarHidden = NO;
假如個人APP,第一次啓動請求了登陸接口並獲得了Cookie,而後我把APP關了,下次啓動APP,我不請求登陸接口了,那上次獲得的Cookie就不存在了。若是須要,那麼2種方法,下次啓動app,自動登入,這樣能獲得服務器分配給你的cookier(這一種是最好的,由於session也會過時),還有一種是你把上次登入的時候,拿到的cookier存起來,而後下次啓動app的時候,手動給請求(ASIHTTP)添加cookie。
因此當第一次登陸成功後,能夠把cookie保存到CoreData,SQLite,UserDefault等,等到下次網絡請求時,讀取:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:UserInfoURL];
[request setRequestMethod:@"POST"];
[request addRequestHeader:@"Cookie" value:[NSString stringWithFormat:@"cookie=%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"cookie"]]];//把cookie的值放進Header裏,這個cookie的值是一串很長的字符串。
TextField設置這個屬性爲YES就能夠了,默認爲NO
searchField.enablesReturnKeyAutomatically =YES;
實際上是一個小氣泡png,而後拉伸中間部分,四個角不拉動,就是局部拉伸。ios自帶方法,四個角能夠不拉伸的,以下:
首先要實現TextField的delegate,在方法:
這說明當開始輸入時,tableview在原來的基礎上向上擡起70個距離。多個UITextFiled能夠經過判斷來使用CGPoint的調整高度,我這寫的是70.
tableview的scrollEnabled屬性必定要是YES;要否則滾動不了了。記得在return時復原tableview的位置:
咱們給本身的工程添加一個通用的斷點:
一步步按上面圖完成操做。
再運行程序
自動就斷點到這裏來了,
log信息是:
從UImageView上找ContentMode或clipToBounds是都無論用的,正確的辦法是,不用UImageView,使用UIView,而後設置backgroundColor屬性爲咱們的圖片,這樣的話自動會以屏幕的方式顯示。
在開發時,想要在tableview中的某一個Cell設置選中狀態,而且Cell的背景顏色是一個自定義顏色。
【補充】若是想在reload或init時設置tableview的某一cell爲 selected狀態,千萬不要使用cell setSelected:YESanimated:YES,使用tableview的方法:
使用系統或簡單自定義的UITableViewCell時,當選中某一行Cell後,除了背景顏色改變外,Cell上全部的組件(數據)好比UILabel,UIbutton等都被自動顯示成了其
Highlighted(高亮)狀態下的效果,(若是想顯示出效果,你的那些自定義的組件必需要設置高亮狀態,好比highlightedTextColor,UIControlStateHighlighted等),因此這一點須要特別注意,若是不想要系統的這個自動特效,有兩個解決辦法:
1,組件不設置highlighted下的屬性
2,若是自定義的Cell:
atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。
atomic
設置成員變量的@property屬性時,默認爲atomic,提供多線程安全。
在多線程環境下,原子操做是必要的,不然有可能引發錯誤的結果。加了atomic,setter函數會變成下面這樣:nonatomic
禁止多線程,變量保護,提升性能。atomic是Objc使用的一種線程保護技術,基本上來說,是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤。而這種機制是耗費系統資源的,因此在iPhone這種小型設備上,若是沒有使用多線程間的通信編程,那麼nonatomic是一個很是好的選擇。
指出訪問器不是原子操做,而默認地,訪問器是原子操做。這也就是說,在多線程環境下,解析的訪問器提供一個對屬性的安全訪問,從獲取器獲得的返回值或者經過設置器設置的值能夠一次完成,即使是別的線程也正在對其進行訪問。若是你不指定 nonatomic ,在本身管理內存的環境中,解析的訪問器保留並自動釋放返回的值,若是指定了 nonatomic ,那麼訪問器只是簡單地返回這個值。
assign
對基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float, double, char)等等。
此標記說明設置器直接進行賦值,這也是默認值。在使用垃圾收集的應用程序中,若是你要一個屬性使用assign,且這個類符合NSCopying協 議,你就要明確指出這個標記,而不是簡單地使用默認值,不然的話,你將獲得一個編譯警告。這再次向編譯器說明你確實須要賦值,即便它是 可拷貝的。
retain
對其餘NSObject和其子類對參數進行release舊值,再retain新值
指定retain會在賦值時喚醒傳入值的retain消息。此屬性只能用於Objective-C對象類型,而不能用於Core Foundation對象。(緣由很明顯,retain會增長對象的引用計數,而基本數據類型或者Core Foundation對象都沒有引用計數——譯者注)。
注意: 把對象添加到數組中時,引用計數將增長對象的引用次數+1。
copy
對NSString 它指出,在賦值時使用傳入值的一份拷貝。拷貝工做由copy方法執行,此屬性只對那些實行了NSCopying協議的對象類型有效。更深刻的討論,請參考「複製」部分。
copy與retain:
Copy實際上是創建了一個相同的對象,而retain不是:
1.好比一個NSString 對象,地址爲0×1111 ,內容爲@」STR」,Copy 到另一個NSString 以後,地址爲0×2222 ,內容相同。
2.新的對象retain爲1 ,舊有對象沒有變化retain 到另一個NSString 以後,地址相同(創建一個指針,指針拷貝),內容固然相同,這個對象的retain值+1。
總結:retain 是指針拷貝,copy 是內容拷貝。
assign與retain:
1. 接觸過C,那麼假設你用malloc分配了一塊內存,而且把它的地址賦值給了指針a,後來你但願指針b也共享這塊內存,因而你又把a賦值給(assign)了b。此時a和b指向同一塊內存,請問當a再也不須要這塊內存,可否直接釋放它?答案是否認的,由於a並不知道b是否還在使用這塊內存,若是a釋放了,那麼b在使用這塊內存的時候會引發程序crash掉。
2. 瞭解到1中assign的問題,那麼如何解決?最簡單的一個方法就是使用引用計數(reference counting),仍是上面的那個例子,咱們給那塊內存設一個引用計數,當內存被分配而且賦值給a時,引用計數是1。當把a賦值給b時引用計數增長到2。這時若是a再也不使用這塊內存,它只須要把引用計數減1,代表本身再也不擁有這塊內存。b再也不使用這塊內存時也把引用計數減1。當引用計數變爲0的時候,表明該內存再也不被任何指針所引用,系統能夠把它直接釋放掉。
總結:上面兩點其實就是assign和retain的區別,assign就是直接賦值,從而可能引發1中的問題,當數據爲int, float等原生類型時,可使用assign。retain就如2中所述,使用了引用計數,retain引發引用計數加1, release引發引用計數減1,當引用計數爲0時,dealloc函數被調用,內存被回收。
它們告訴Xcode編譯器,要在編輯器窗格頂部的方法和函數彈出菜單中將代碼分隔開;注意 #pragma mark – 的「-」後面不能有空格。若是你的標誌沒有出如今彈出菜單中,好比沒有分隔線出現,請在Xcode菜單 「Preferences..」中的 「Code Sense」選項取消選中」Sort listalphabetically」便可。
咱們經過發送消息給對象出發特定動做;對象發送某些變化的時候經過回調函數(callback)通知咱們。對象在特定事件發生的時候,就會調用對應的回調函數,觸發業務邏輯。回調函數經過所謂的代理(Delegation)來實現.
delegate使用方法:
@property (assign) <id>xxxDelegate delegate;
正確的使用方法是使用assign屬性而不是retain。之因此對於delegate這類對象使用assign而不是用retain是爲了防止循環retain(retain loop)
使用@property和@synthesize聲明一個成員變量,給其賦值是時要在前面加上"self.",以便調用成員變量的setmember方法。直接調用成員變量而且給其賦值:member=[NSString stringWithFormat:@」」];將不執行setmember 方法。
使用self調用成員變量而且給其賦值:self.member=[NSString stringWithFormat:@」」];將執行setmember方法。
因此看到這裏,應該明白button.setBackgroundImage 和 set Image 的區別了吧,前者是能夠同時設置文字,後者是一旦設置了image,沒法再顯示文字。
普通:高亮:
[formatter setDateFormat:@"yyyy-MM-dd HH:mm"]; 這種格式獲得的數值是精確到秒的,也就是說少1000,
可是嘗試[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];或SS大寫,或[formattersetDateFormat:@"yyyy-MM-dd HH:mm.ss.SSS"];都不起做用,最後才發現,原來是這樣
NSTimeInterval自己是個秒級別的double類型數值,小數點後面即毫秒數,*1000.0f便可獲得毫秒級別的時間差
//爲了兼容java版本,事件是從1970/1/1開始
-(NSDate *)getDateTimeFromMilliSeconds:(long long) miliSeconds
{
NSTimeInterval tempMilli = miliSeconds;
NSTimeInterval seconds = tempMilli/1000.0;
NSLog(@"seconds=%f",seconds);
return [NSDate dateWithTimeIntervalSince1970:seconds];
}
//將NSDate類型的時間轉換爲NSInteger類型,從1970/1/1開始
-(long long)getDateTimeTOMilliSeconds:(NSDate *)datetime
{
NSTimeInterval interval = [datetime timeIntervalSince1970];
NSLog(@"interval=%f",interval);
long long totalMilliseconds = interval*1000 ;
NSLog(@"totalMilliseconds=%llu",totalMilliseconds);
return totalMilliseconds;
}
也就是說,計算結果再本身乘以1000就能夠了
Objective-C 支持全局變量
主要有兩種實現方式:
(1)第一種和C/C++中的同樣, 使用"extern"關鍵詞;
(2)另一種就是使用單例實現。
(好比咱們常常會把一個變量放在AppDelegate裏面做爲全局變量來訪問, 其中AppDelegate就是一個單例類)這樣在其它類中你就不須要建立A類的實例來對static變量進行訪問。雖然該static變量並非A類的靜態成員變量,可是也算達到了一樣的效果。static變量的做用域被限制在單一的文件中。
警告: static 寫在interface外面編譯是沒有錯誤的,可是編譯器會報警告,這麼說這樣的寫法是不被編輯器承認的。
錯誤:static 寫在interface裏面會直接報錯,顯然這樣的語法是不被承認的。
static關鍵字聲明的變量必須放在implementation外面,或者方法中,若是不爲它賦值默認爲0,
它只在程序開機初始化一次。
簡單點的來,兩個界面間傳值,直接上代碼了:
sendViewcontroller.m
SettingViewController.m(接收值的viewcontroller)
這樣就實現了基本的使用,跟delegate相似,注意 addObserver時,須要寫目標viewcontroller的實例,而不是self。
如上圖所示,遇到這個錯誤,從字面的意思咱們大體能猜到,是有屬性已經被release掉了,可是咱們又使用它了,因此,一部一部排查把,必定有某個地方的屬性提早被release掉了,本身手動管理內存就會有這樣的困惱,代碼不少,不想去找,必定要有耐心,找的過程還能夠學到不少知識。
如上圖,這個就是我找到的緣由所在,unarchiver release掉了,而咱們在其它的類中想使用location的屬性。
在mac os 10.8中,svn Command line tools是沒有自動安裝的,這樣的話,svn 命令行就會失效,解決辦法:
1.打開xcode偏好設置(comand+,)-->"Download" -->Components:
2.點擊「Command line tools」下載,下載完成以後安裝。
3.安裝完成以後,打開終端,輸入「svn help」,若是出現以下所示,說明命令行工具安裝好了。