一、代碼管理工具----分佈式版本控制系統github,在上邊新建一個項目的代碼倉庫,把代碼同步到git服務器上。下邊介紹一個常用的git終端命令:
git clone "SSH網址"從github上克隆代碼到本地、
git branch 列出已有的分支、
git checkout "branchname" 切換分支名稱、
git add . 添加新文件或者更改新文件、
git status 查看更新狀態、
git rm "文件名" 刪除github上文件、
git commit -m "name"提交更改文件到本地並且添加一個名字、
git pull /git pull origin "branchname"從服務器上拉取信息、
git push origin "branchname"提交到服務器上、
git merge 合併版本、
git log查看提交修改目錄。
gitk 打開github自帶圖形用戶界面
mate "Zhangmengge.xcodeproj" 用textmate打開工程文件
二、iphone工程命名規範:
進入工程後有四個文件夾:
第一個Resources存放的是第一次美工給的圖片,包含測試圖和座標圖並不是最終要添加到工程裏的文件。
第二個是工程名字的文件夾。
第三個Frameworks裏存放了工程所有用到的框架。
第四個是這個工程的app文件。
在工程名的文件夾裏包含有5個文件夾:
第一個config是一個全局的配置文件,裏邊主要放所有用到的宏定義。
第二個App文件夾裏放的是所有的代碼文件。
第三個libs文件夾裏放所有用到的第三方框架。
第四個Resources裏邊存放的是工程中所有用到的圖片素材。
第五個supporting files是一個支持文件,裏邊主要是自動生成文件,例如plist文件、main函數、pch文件,在pch文件裏寫的主要是一些被很多頁面都要引用的框架名稱,寫在這裏邊就會自動引用到所有頁面。
三、 自定義Button形狀的第三方框架OBShapedButton:
圖片素材的其它區域要給成透明的,然後用OBShapedButton初始化創建一個對象,後邊用法跟創建系統Button一樣:
OBShapedButton * sharebtn = [OBShapedButton buttonWithType:UIButtonTypeCustom]; sharebtn.frame = CGRectMake(10, 40, 300, 436); [sharebtn setImage:[UIImage imageNamed:@"xiepinglun_backgound_cut.png"] forState:UIControlStateNormal]; [sharebtn addTarget:self action:@selector(onTop) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:sharebtn];
四、textview、textfield回收鍵盤方法:
都需要把delegate設成自己:
-(BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@"\n"]) { [textView resignFirstResponder]; return NO; } return YES; }
五、字符串替換、數組反向排序:
//字符串替換 self.finalStr = [self.tempStr stringByReplacingOccurrencesOfString:@"</p>" withString:@" "]; //將數組元素反向排列 [self.articleList reverseObjectEnumerator];
六、修改編譯文件(Build)位置:
編寫程序時經常會出現一些莫名其妙的錯誤,而且怎麼找都找不到錯誤,這個時候就該考慮一下是不是build的問題,需要clean build一下。在xcode裏Preferences裏的Locations把Derived Data的Default改成Relative,然後把後邊括號裏改成build,這樣每次編譯會在你的工程目錄裏多出一個build文件夾,在出現奇怪錯誤時可以build目錄清理一下。
七、DLog:
編寫程序時經常需要用NSLog輸出一些數據,當整個程序寫完時可能已經寫了無數個NSLog,不可能一個一個刪了,而且日後如果修改還需要在寫非常麻煩。解決辦法在.pch裏寫這樣一段宏命令
//把NSLog換成DLog,以後就不用一個一個刪除 #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #else # define DLog(...) #endif // ALog always displays output regardless of the DEBUG setting #define ALog(fmt, ...) NSLog((@"%s [line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
然後在程序中需要用NSLog的地方全部換成DLog。編寫程序時把Edit SchemeL裏Build Configuration選項改成Debug(默認就是Debug),程序會正常輸出打印。當上線發佈時把Debug改成Release,所以DLog就不會打印輸出了。
八、如何判斷設備是iphone5:
在.pch裏添加一段宏命令
//判斷設備是不是iphone5 #define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
在程序中只需判斷:
if (iPhone5) { // Initialization code ... }
九、去掉cell選中時的藍色背景:
在cellForRowAtIndexPath里加上一句話:
static NSString *CellIdentifier = @"Cell"; MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // Configure the cell... if (cell == nil) { cell = [[[MyCustomCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease]; } //設置選中後cell的背景顏色,有黑色,灰色,藍色,和不顯示顏色四種 cell.selectionStyle = UITableViewCellAccessoryNone;
十、如何判斷程序第一次進入:
在AppDelegate裏開始位置寫
//判斷程序是否第一次進入 if (![[NSUserDefaults standardUserDefaults]boolForKey:@"everLaunched"]) { [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"everLaunched"]; [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"firstLaunch"]; }else{ [[NSUserDefaults standardUserDefaults]setBool:NO forKey:@"firstLaunch"]; } // Save changes to disk [[NSUserDefaults standardUserDefaults] synchronize];
在需要對第一次進行操作時寫:
-(void)firstLaunch { if ([[NSUserDefaults standardUserDefaults]boolForKey:@"firstLaunch"]) { // Initialization code }else { // Initialization code } }
十一、IOS的沙盒機制:
IOS爲每個應用程序都創建了一個文件系統,每個應用程序只能讀取這個文件系統中的文件,不能訪問其他程序的文件系統。此區域就被稱爲沙盒,所有的非代碼文件都保存在這裏。例如圖像、聲音、屬性列表、本地文件等。有兩點需要注意:
1.每個應用程序都有屬於自己的儲存空間。
2.每個應用程序只能訪問自己的空間,不能訪問其他程序的儲存空間。
每臺MAC電腦的用戶名文件夾下都有一個默認隱藏的文件夾,叫資源庫:
1.顯示資源庫的終端命令:chflags nohidden ~/Library/
2.隱藏資源庫的終端命令:chflags hidden ~/Library/
顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
怎樣找到應用程序的沙河路徑:
每個沙盒中都有3個文件夾:1.Documents 2.Library 3.tmp
Documents:程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄
Library:存儲程序的默認設置或其它狀態信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除
tmp:提供一個即時創建臨時文件的地方。
itunes在與iphone同步時,備份所有的Documents和Library文件。
iphone在重啓時,會丟棄所有的tmp文件。
十二、程序多語言支持或者經常程序會丟失Info.Plist.String(Chinese):
在工程裏PROJECT------Localizations下邊有個加號,點擊一下就會出來很多國家的plist.string文件
十三、檢測網路:
用第三方框架NetworkChecker來判斷,代碼如下,首先引入頭文件
#import "NetworkChecker.h"
然後在.h裏定義一個實例方法
-(BOOL)checkNetwork;
在.m文件中寫
- (BOOL)checkNetwork { NetworkChecker *networkchecker = [NetworkChecker sharedNetworkChecker]; if ([networkchecker networkStatus] == NotReachable) { return NO;//返回NO是沒網狀態 } else { return YES;//返回YES是有網狀態 } }
寫完後當要用到判斷網絡的地方,這樣寫
if (![self checkNetwork]) { //當沒有網絡時執行的方法 }else{ //有網情況下執行方法 }
十四、用Blocks寫網絡請求:
NSString * str = [NSString stringWithFormat:@"http://star.eliteworkltd.com:8002/?json=1&p=1413"]; NSURL * url = [NSURL URLWithString:str]; //__block的作用是能在setCompletionBlock的內部訪問外部的方法 __block ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url]; [request setRequestMethod:@"GET"]; [request setCompletionBlock:^{ //相當於ASi的RequestFinished方法 }]; [request setFailedBlock:^{ //相當於ASI的RequestFailed方法 UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"親" message:@"非常抱歉" delegate:nil cancelButtonTitle:@"您的網絡不給力(︶︿︶)。。。" otherButtonTitles:nil, nil]; [alert show]; [alert release]; }]; //啓動異步執行 [request startAsynchronous];
十五、SDWebImage:
跟以前的AsycImage用法有些相似,只用給一個圖片的url地址即可,sdweb會自動幫你讀出圖片並且緩存,sdweb和Asy不同之處是sdweb需要給一張佔位圖,在圖片沒加載出來之前會先顯示這張佔位圖。sdweb裏邊有個UIImageView+WebCache類,它是一個繼承imageview的類目,在.m文件中引入頭文件
#import "UIImageView+WebCache.h"
用法
[cell.imageview2 setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"57.png"]];
十六、截取當前頁面到相冊:
需要添加QuartzCore.framework框架,並且引入頭文件
#import <QuartzCore/QuartzCore.h>
//保存圖片到相冊 UIGraphicsBeginImageContext(self.view.bounds.size);//當前視圖 [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"親" message:@"圖片已經爲您保存到相冊" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil]; [alert show]; [alert release];
十七、在程序內發郵件:
在程序內發送Email,需要添加MessageUI.framework框架,import頭文件,加MFMailComposeViewControllerDelegate代理
#import <MessageUI/MFMailComposeViewController.h> @interface DetailViewController : UIViewController<MFMailComposeViewControllerDelegate> { } @end
然後調用方法:
//激活郵件功能 [self sendMailInApp];
然後在下邊寫sendMailInApp方法
#pragma mark ------- Send Email -(void)sendMailInApp { Class mailClass = (NSClassFromString(@"MFMailComposeViewController")); if (mailClass != nil) { if ([mailClass canSendMail]) { [self displayComposerSheet]; }else { [self launchMailAppOnDevice]; } } else { [self launchMailAppOnDevice]; } } -(void)displayComposerSheet { MFMailComposeViewController * mailPicker = [[[MFMailComposeViewController alloc]init] autorelease]; mailPicker.mailComposeDelegate = self; //設置主題 [mailPicker setSubject:[NSString stringWithFormat:@"%@%@%@%@",@"分享自張夢格APP",@"《",self.titleString,@"》"]]; //添加發送者 NSArray * toRecipients = [NSArray arrayWithObject:@"[email protected]"]; [mailPicker setToRecipients:toRecipients]; /* //email正文裏添加圖片 UIImage * addPic = [UIImage imageNamed:@"123.jpg"]; NSData * imageData = UIImagePNGRepresentation(addPic); [mailPicker addAttachmentData:imageData mimeType:@"" fileName:@"123.jpg"]; */ NSString * emailBody = nil; [mailPicker setMessageBody:emailBody isHTML:YES]; [self presentModalViewController:mailPicker animated:YES]; } -(void)launchMailAppOnDevice { NSString * recipients = @"mailto:[email protected]&subject=my email!"; NSString * body = @"&body=email body!"; NSString * email = [NSString stringWithFormat:@"%@%@",recipients,body]; email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [[UIApplication sharedApplication]openURL:[NSURL URLWithString:email]]; } -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { NSString * message; switch (result) { case MFMailComposeResultCancelled://用戶取消編輯郵件 message = @"郵件發送取消"; break; case MFMailComposeResultSaved: //用戶成功保存郵件 message = @"郵件保存成功"; break; case MFMailComposeResultSent: //用戶點擊發送,將郵件放到隊列中 message = @"郵件發送成功"; break; case MFMailComposeResultFailed: //用戶試圖保存或者發送郵件失敗 message = @"郵件發送失敗"; break; default: break; } DLog(@"%@", message); [self dismissModalViewControllerAnimated:YES]; }
十八、iphone開發的一些總結(原文出自編程神人老莫):
1.Done is better than perfect(尤其是程序第一次提交,不要想着把東西做的多好多炫多麼天花亂墜之後在上線,一定要以一個簡單又能通過的方式先提交第一版,然後在做第二版更新);
2.優先、儘早的學習蘋果的新技術,因爲你遲早都是要學的;
3.好的平面設計不等於好的iphone設計,web的一套設計在移動設備上並不適用;
4.選擇被證實的成功上線案列走,因爲前人已經爲你走過無數次的reject之路;
5.你的app要值得用戶反覆去用,要區別於同類產品。
十九、最後總結幾點蘋果審覈幾個要點(都是經過血淚的教訓才總結出來的經驗),不遵循這些規則你的應用很可能被打回:
1.我的應用第一次被打回來蘋果給了原因是服務器太慢,程序裏的圖片出不來,後來換了服務器,並且在代碼上做了優化;第二次又被駁回,蘋果給你的原因是not very useful,Simply web sites bundled as apps,蘋果認爲程序過於簡單,就跟一個web的應用一樣;don’t provide any lasting entertainment value(不能提供任何的持續的娛樂價值) ,後來把程序主題框架換成了Path菜單,又加入了用戶留言板功能才通過。
2.bug和崩潰:首先最重要一點提交的程序一定不能有bug和崩潰,如果有必定會被打回。
3.條款違規:不符合國家法律規定的,含有嚴重暴力色情內容的。
4.侵權:也就是說不要有侵權行爲或者是竊取用戶隱私,被發現的化一定會被打回。
5.功能描述與事實不符,軟件說明上吹的多牛X多牛叉,實際上根本就沒有 。
6.不能用蘋果私有的API
7.山寨:抄襲別人軟件創意,嚴重雷同
8.軟件功能不能影響蘋果自己的產品,搶蘋果生意的,最後都會被pass
原文:http://blog.csdn.net/crazyzhang1990/article/details/12503173