三:使用NSXMLParser解析xml文件 1. 設置委託對象,開始解析 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; //或者也可使用initWithContentsOfURL直接下載文件,可是有一個緣由不這麼作: // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable // because it gives less control over the network, particularly in responding to connection errors. [parser setDelegate:self]; [parser parse]; 2. 經常使用的委託方法 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict; - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName; - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; 3. 應用舉例 - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error { NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; [parser setDelegate:self]; [parser setShouldProcessNamespaces:NO]; [parser setShouldReportNamespacePrefixes:NO]; [parser setShouldResolveExternalEntities:NO]; [parser parse]; NSError *parseError = [parser parserError]; if (parseError && error) { *error = parseError; } [parser release]; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ // 元素開始句柄 if (qName) { elementName = qName; } if ([elementName isEqualToString:@"user"]) { // 輸出屬性值 NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 元素終了句柄 if (qName) { elementName = qName; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // 取得元素的text } NSError *parseError = nil; [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; Iphone 實現畫折線圖 iphone裏面要畫圖通常都是經過CoreGraphics.framwork和QuartzCore.framwork實現,apple的官方sdk demon中包含了QuartzCore的基本用法, 具體demo請參考http://developer.apple.com/library/ios/#samplecode/QuartzDemo/ 折線圖 要實現折線圖也就把所有的點連起來,movePointLineto,具體的調用裏面的api就能夠實現了,可是畫座標就比較麻煩了,裏面須要去轉不少,好在國外有人開源了一個畫折線圖的開發包,首先看看效果吧,具體怎麼用能夠參考做者git版本庫中的wiki。 http://github.com/devinross/tapkulibrary/wiki/How-To-Use-This-Library 這個包還提供了其餘的很好看的UI,均可以調來用,可是咱們只須要一個畫圖要把整個包都導進去,工程太大了,既然是開源的那就想辦法提取出來吧,原先以前也有人幹過這樣的事。http://duivesteyn.net/2010/03/07/iphone-sdk-implementing-the-tapku-graph-in-your-application/ 我對源代碼進行簡單的修改,使其顯示座標之類的,更加符合工程的須要,可是尚未實現畫多組數據,只能畫一組數據,不用viewContol,而使用addsubview,直接添加到當前的窗口,最終效果以下。 使用方法: 1.工程添加tk庫裏面的以下文件 2. 添加QuartzCore framework #import <QuartzCore/QuartzCore.h> 添加TapkuLibrary.bundle資源文件 3.代碼中完成實例,數據初始化就能夠用了 下載修改後的版本。下次有時間在整理一個工程版本出來。 讓iPhone屏幕常亮不變暗的方法 若是您但願運行本身開發的App時,iPhone的屏幕再也不自動變暗,可使用如下方法讓屏幕常亮: iPhone OS用一個布爾值用來控制是否取消應用程序空閒時間:@property(nonatomic, getter=isIdleTime 若是您但願運行本身開發的App時,iPhone的屏幕再也不自動變暗,可使用如下方法讓屏幕常亮: iPhone OS用一個布爾值用來控制是否取消應用程序空閒時間:@property(nonatomic, getter=isIdleTimerDisabled) BOOL idleTimerDisabled。這個值的默認屬性是"NO"。當大多數應用程序沒有接收到用戶輸入信息的時候,系統會把設備設置成「休眠」狀態,iPhone屏幕也會變暗。這樣作是爲了保存更多電量。事實上,應用程序在運行加速度遊戲的時候是不須要用戶輸入的,固然這裏只是一個假設,把這個變量設置爲"YES",來取消系統休眠的「空閒時間」。 重點是:你必須當真正須要的時候纔打開這個屬性當你不用的時候立刻還願成"NO"。大多數應用程序在休眠時間到的時候讓系統關閉屏幕。這個包括了有音頻的應用程 序。在Audio Session Services中使用適當的回放和記錄功能不會被間斷當屏幕關閉時。只有地圖應用程序,遊戲或者一些不間斷的用戶交互程序能夠取消這個屬性。 蘋果開發網絡編程知識總結 如下蘋果開發網絡編程知識由 CocoaChina 會員 cocoa_yang 總結,但願能爲蘋果開發新手梳理知識脈絡,節省入門時間。一:確認網絡環境3G/WIFI 1. 添加源文件和framework 開發Web等網絡應用程序 如下蘋果開發網絡編程知識由 CocoaChina 會員 「cocoa_yang」 總結,但願能爲蘋果開發新手梳理知識脈絡,節省入門時間。 一:確認網絡環境3G/WIFI 1. 添加源文件和framework 開發Web等網絡應用程序的時候,須要確認網絡環境,鏈接狀況等信息。若是沒有處理它們,是不會經過Apple的審查的。 Apple 的 例程 Reachability 中介紹了取得/檢測網絡狀態的方法。要在應用程序程序中使用Reachability,首先要完成以下兩部: 1.1. 添加源文件: 在你的程序中使用 Reachability 只須將該例程中的 Reachability.h 和 Reachability.m 拷貝到你的工程中。以下圖: 1.2.添加framework: 將SystemConfiguration.framework 添加進工程。以下圖: 2. 網絡狀態 Reachability.h中定義了三種網絡狀態: typedef enum { NotReachable = 0, //無鏈接 ReachableViaWiFi, //使用3G/GPRS網絡 ReachableViaWWAN //使用WiFi網絡 } NetworkStatus; 所以能夠這樣檢查網絡狀態: Reachability *r = [Reachability reachabilityWithHostName:@「www.apple.com」]; switch ([r currentReachabilityStatus]) { case NotReachable: // 沒有網絡鏈接 break; case ReachableViaWWAN: // 使用3G網絡 break; case ReachableViaWiFi: // 使用WiFi網絡 break; } 3.檢查當前網絡環境 程序啓動時,若是想檢測可用的網絡環境,能夠像這樣 // 是否wifi + (BOOL) IsEnableWIFI { return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); } // 是否3G + (BOOL) IsEnable3G { return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); } 例子: - (void)viewWillAppear:(BOOL)animated { if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { self.navigationItem.hidesBackButton = YES; [self.navigationItem setLeftBarButtonItem:nil animated:NO]; } } 4. 連接狀態的實時通知 網絡鏈接狀態的實時檢查,通知在網絡應用中也是十分必要的。接續狀態發生變化時,須要及時地通知用戶: Reachability 1.5版本 // My.AppDelegate.h #import "Reachability.h" @interface MyAppDelegate : NSObject <UIApplicationDelegate> { NetworkStatus remoteHostStatus; } @property NetworkStatus remoteHostStatus; @end // My.AppDelegate.m #import "MyAppDelegate.h" @implementation MyAppDelegate @synthesize remoteHostStatus; // 更新網絡狀態 - (void)updateStatus { self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; } // 通知網絡狀態 - (void)reachabilityChanged:(NSNotification *)note { [self updateStatus]; if (self.remoteHostStatus == NotReachable) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) message:NSLocalizedString (@"NotReachable", nil) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [alert show]; [alert release]; } } // 程序啓動器,啓動網絡監視 - (void)applicationDidFinishLaunching:(UIApplication *)application { // 設置網絡檢測的站點 [[Reachability sharedReachability] setHostName:@"www.apple.com"]; [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; // 設置網絡狀態變化時的通知函數 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:@"kNetworkReachabilityChangedNotification" object:nil]; [self updateStatus]; } - (void)dealloc { // 刪除通知對象 [[NSNotificationCenter defaultCenter] removeObserver:self]; [window release]; [super dealloc]; } Reachability 2.0版本 // MyAppDelegate.h @class Reachability; @interface MyAppDelegate : NSObject <UIApplicationDelegate> { Reachability *hostReach; } @end // MyAppDelegate.m - (void)reachabilityChanged:(NSNotification *)note { Reachability* curReach = [note object]; NSParameterAssert([curReach isKindOfClass: [Reachability class]]); NetworkStatus status = [curReach currentReachabilityStatus]; if (status == NotReachable) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" message:@"NotReachable" delegate:nil cancelButtonTitle:@"YES" otherButtonTitles:nil]; [alert show]; [alert release]; } } - (void)applicationDidFinishLaunching:(UIApplication *)application { // ... // 監測網絡狀況 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; hostReach startNotifer]; // ... } 二:使用NSConnection下載數據 1.建立NSConnection對象,設置委託對象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; [NSURLConnection connectionWithRequest:request delegate:self]; 2. NSURLConnection delegate委託方法 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; - (void)connectionDidFinishLoading:(NSURLConnection *)connection; 3. 實現委託方法 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // store data [self.receivedData setLength:0]; //一般在這裏先清空接受數據的緩存 } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { /* appends the new data to the received data */ [self.receivedData appendData:data]; //可能屢次收到數據,把新的數據添加在現有數據最後 } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { // 錯誤處理 } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { // disconnect [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; NSLog(returnString); [self urlLoaded:[self urlString] data:self.receivedData]; firstTimeDownloaded = YES; } 三:使用NSXMLParser解析xml文件 1. 設置委託對象,開始解析 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; //或者也可使用initWithContentsOfURL直接下載文件,可是有一個緣由不這麼作: // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable // because it gives less control over the network, particularly in responding to connection errors. [parser setDelegate:self]; [parser parse]; 2. 經常使用的委託方法 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict; - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName; - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; 3. 應用舉例 - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error { NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; [parser setDelegate:self]; [parser setShouldProcessNamespaces:NO]; [parser setShouldReportNamespacePrefixes:NO]; [parser setShouldResolveExternalEntities:NO]; [parser parse]; NSError *parseError = [parser parserError]; if (parseError && error) { *error = parseError; } [parser release]; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ // 元素開始句柄 if (qName) { elementName = qName; } if ([elementName isEqualToString:@"user"]) { // 輸出屬性值 NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { // 元素終了句柄 if (qName) { elementName = qName; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // 取得元素的text } NSError *parseError = nil; [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 如何隱藏狀態欄 [ UIApplication sharedApplication ].statusBarHidden = YES; .m 文件與.mm文件的區別 .m文件是object-c文件 .mm文件至關於c++或者c文件 NSLog(@"afd")與 NSLog("afd") 細微差異會致使程序崩潰。 可是我不太明白爲什麼蘋果要把編譯器作的對這兩種常量有區別。 不過值得一提的是可能爲了方便蘋果自身的NSObject對象的格式化輸出。 safari其實沒有把內存的緩存寫到存儲卡上 NSURLCache doesn't seem to support writing to disk on iPhone. The documentation for NSCachedURLResponse says that the NSURLCacheStoragePolicy "NSURLCacheStorageAllowed" is treated as "NSURLCacheStorageAllowedInMemoryOnly" by iPhone OS. 官方文檔是這麼說的。 爲了證實這個,我找到了一個目錄。 /private/var/mobile/Library/Caches/Safari/Thumbnails 隨機數的使用 頭文件的引用 #import <time.h> #import <mach/mach_time.h> srandom()的使用 srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF)); 直接使用 random() 來調用隨機數 在UIImageView 中旋轉圖像 float rotateAngle = M_PI; CGAffineTransform transform =CGAffineTransformMakeRotation(rotateAngle); imageView.transform = transform; 以上代碼旋轉imageView, 角度爲rotateAngle, 方向能夠本身測試哦! 在Quartz中如何設置旋轉點 UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg.png"]]; imageView.layer.anchorPoint = CGPointMake(0.5, 1.0); 這個是把旋轉點設置爲底部中間。記住是在QuartzCore.framework中才獲得支持。 建立.plist文件並存儲 NSString *errorDesc; //用來存放錯誤信息 NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:4]; //NSDictionary, NSData等文件能夠直接轉化爲plist文件 NSDictionary *innerDict; NSString *name; Player *player; NSInteger saveIndex; for(int i = 0; i < [playerArray count]; i++) { player = nil; player = [playerArray objectAtIndex:i]; if(player == nil) break; name = player.playerName;// This "Player1" denotes the player name could also be the computer name innerDict = [self getAllNodeInfoToDictionary:player]; [rootObj setObject:innerDict forKey:name]; // This "Player1" denotes the person who start this game } player = nil; NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc]; 紅色部分能夠忽略,只是給rootObj添加一點內容。這個plistData爲建立好的plist文件,用其writeToFile方法就能夠寫成文件。下面是代碼: /*獲得移動設備上的文件存放位置*/ NSString *documentsPath = [self getDocumentsDirectory]; NSString *savePath = [documentsPath stringByAppendingPathComponent:@"save.plist"]; /*存文件*/ if (plistData) { [plistData writeToFile:savePath atomically:YES]; } else { NSLog(errorDesc); [errorDesc release]; } - (NSString *)getDocumentsDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); return [paths objectAtIndex:0]; } 讀取plist文件並轉化爲NSDictionary NSString *documentsPath = [self getDocumentsDirectory]; NSString *fullPath = [documentsPath stringByAppendingPathComponent:@"save.plist"]; NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:fullPath]; 讀取通常性文檔文件 NSString *tmp; NSArray *lines; /*將文件轉化爲一行一行的*/ lines = [[NSString stringWithContentsOfFile:@"testFileReadLines.txt"] componentsSeparatedByString:@"\n"]; NSEnumerator *nse = [lines objectEnumerator]; // 讀取<>裏的內容 while(tmp = [nse nextObject]) { NSString *stringBetweenBrackets = nil; NSScanner *scanner = [NSScanner scannerWithString:tmp]; [scanner scanUpToString:@"<" intoString:nil]; [scanner scanString:@"<" intoString:nil]; [scanner scanUpToString:@">" intoString:&stringBetweenBrackets]; NSLog([stringBetweenBrackets description]); } 對於讀寫文件,還有補充,暫時到此。隨機數和文件讀寫在遊戲開發中常常用到。因此把部份內容放在這,以便和你們分享,也當記錄,便於查找。 隱藏NavigationBar [self.navigationController setNavigationBarHidden:YES animated:YES]; 在想隱藏的ViewController中使用就能夠了。 如何在iPhone程序中調用外部命令 下面是如何在iPhone非官方SDK程序中調用外部命令的方法。 - ( NSString * ) executeCommand : ( NSString * ) cmd { NSString * output = [ NSString string ] ; FILE * pipe = popen ( [ cmd cStringUsingEncoding : NSASCIIStringEnc 下面是如何在iPhone非官方SDK程序中調用外部命令的方法。 - (NSString *)executeCommand: (NSString *)cmd { NSString *output = [NSString string]; FILE *pipe = popen([cmd cStringUsingEncoding: NSASCIIStringEncoding], "r"); if (!pipe) return; char buf[1024]; while(fgets(buf, 1024, pipe)) { output = [output stringByAppendingFormat: @"%s", buf]; } pclose(pipe); return output; } NSString *yourcmd = [NSString stringWithFormat: @"your command"]; [self executeCommand: yourcmd]; 如何在iPhone程序讀取數據時顯示進度窗 下面代碼說明如何使用iPhone 非官方SDK在讀取數據時顯示進度條。 如下代碼參考了MobileRss。 定義頭文件: #import "uikit/UIProgressHUD.h" @interface EyeCandy : UIApplication { UIProgressHUD *progress; } - (void) showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect; - (void) hideProgressHUD; .@end 上面的引號要改爲<>。 import "EyeCandy.h" @implementation EyeCandy - (void)showProgressHUD:(NSString *)label withWindow:(UIWindow *)w withView:(UIView *)v withRect:(struct CGRect)rect { progress = [[UIProgressHUD alloc] initWithWindow: w]; [progress setText: label]; [progress drawRect: rect]; [progress show: YES]; [v addSubview:progress]; } - (void)hideProgressHUD { [progress show: NO]; [progress removeFromSuperview]; } @end 使用下面代碼調用: // Setup Eye Candy View _eyeCandy = [[[EyeCandy alloc] init] retain]; // Call loading display [_eyeCandy showProgressHUD:@"Loading …" withWindow:window withView:mainView withRect:CGRectMake(0.0f, 100.0f, 320.0f, 50.0f)]; // When finished for hiding the "loading text" [_eyeCandy hideProgressHUD]; WebKit的基本用法 WebKit是蘋果開發中比較經常使用的瀏覽器引擎,Safari使用的正是WebKit引擎。WebKit基於KDE的KHTML加以再開發,解析速度超過了以往全部的瀏覽器。這裏簡單記錄一下WebKit的基本用法。 WebKit由下面的結構組成: •DomCore •JavaScriptCore •WebCore 通常瀏覽 要打開網頁,能夠這樣作: 1.[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlText]]]; DomCore DomCore用於處理DOM文檔,包括: •DOMDocument •DOMNamedNodeMap •DOMNode •DOMNodeList 要獲取一個DOMDocument,能夠這樣作: 1.DOMDocument *myDOMDocument = [[webView mainFrame] DOMDocument]; 要用於HTML處理,可使用DOMHTMLDocument(Mac OS X 10.4以後),獲取方式相同: 1.DOMHTMLDocument *myDOMDocument = (DOMHTMLDocument*)[[webView mainFrame] DOMDocument]; 方法定義: 蘋果的WebKit更新說明 JavaScriptCore 在WebKit中執行腳本的方法: 1.WebScriptObject *myscript = [webView windowScriptObject]; 2.NSString *script = @"alert('hello');"; 3.[myscript evaluateWebScript script]; 參考: http://www.macgood.com/thread-24636-1-1.html http://www.cocoadev.com/index.pl?WebKit 爲何不要作iPhone上面的應用 簡單來講就是由於兩國的文化不一樣,或者說生活方式的不一樣。美國無論多窮的人都有車,他們平時的生活方式和國內絕對是徹底不一樣的。作應用和作遊戲不同,應用須要知足人們某一 簡單來講就是由於兩國的文化不一樣,或者說生活方式的不一樣。美國無論多窮的人都有車,他們平時的生活方式和國內絕對是徹底不一樣的。作應用和作遊戲不同,應用須要知足人們某一部分的需求,好比,一個計算小費的軟件,在國內不會有市場,但是美國人都有一個。 你們能夠設身處地的想一下,誰會須要你作的軟件,這樣的人有多少,這樣的人又有iPhone的又有多少。 對於應用來講,針對商務人士的又比針對普通人的好,基本上商務人士不太在意幾塊錢一個軟件,這也是backup assistant賣得最好的一個緣由。這個軟件一年的年費24美圓,大約有數千萬美圓一年的收入。什麼樣的應用軟件是這些人須要的?連筆者本身也不太清楚,筆者雖然已經在美國工做了多年,可是對於美國文化的瞭解還處於只知其一;不知其二狀態,更不用說正在留學的學生了。 還有一個能成功的應用軟件是你已經有很是多的數據,好比你有當地的全部加油站的信息,作一個油價的地圖軟件,顯然市場會不錯。不過數據要是美國的數據,國內的沒有太大的幫助。 綜上所述,遊戲比應用好作不少,若是要做應用的話,能夠從單機的小應用開始。要在美國運營一個支持10萬人的網絡應用,沒有30萬美圓絕對沒戲。若是非要上,只能早死早超生了。 獲取iPhone用戶手機號 使用下面的函數能夠返回用戶的手機號: extern NSString *CTSettingCopyMyPhoneNumber(); 而後調用便可。 因爲這個函數是包含在CoreTelephony中,因此只能用於非官方iPhone SDK。 在程序中關閉iPhone 首先在程序中引用 #include sys/reboot.h 而後使用 reboot(RB_HALT); 就能夠直接將iPhone關機。 首先在程序中引用 #include <sys/reboot.h> 而後使用 reboot(RB_HALT); 就能夠直接將iPhone關機。 convert the contents of an NSData object to an NSString 1. NSString *stringFromASC = [NSString stringWithCString:[ascData bytes] length:[ascData length]]; If the NSData object contains unichar characters then do this: NSString *stringFromUnichar = [NSString stringWithCharacters:[unicharData bytes] length:[unicharData length] / sizeof(unichar)]; 2. - (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding iPhone的特殊URL 在iPhone中,能夠直接用UIApp打開URL地址。以下所示: 1.[ UIApp openURL: [ NSURL URLWithString:@"http://www.apple.com" ] ]; 或者: 1.[ UIApp openURL: [ NSURL URLWithString:@"mailto:apple@mac.com?Subject=hello" ] ]; 與此同時,iPhone還包含一些其餘除了http://或者mailto:以外的URL: sms:// 能夠調用短信程序 tel:// 能夠撥打電話 itms:// 能夠打開MobileStore.app audio-player-event:// 能夠打開iPod audio-player-event://?uicmd=show-purchased-playlist 能夠打開iPod播放列表 video-player-event:// 能夠打開iPod中的視頻 get iphone uniqueIdentifier I also find that I can get uniqueIdentifier using: UIDevice *myDevice = [UIDevice currentDevice];NSString *identifier = myDevice.uniqueIdentifier; 打開本地網頁,與遠程網頁 fileURLWithPath:Initializes and returns a newly created NSURL object as a file URL with a specified path. + (id)fileURLWithPath:(NSString *)path URLWithString: Creates and returns an NSURL object initialized with a provided string. + (id)URLWithString:(NSString *)URLString 教你如何使用UIWebView Start by opening up the WebBrowserTutorialAppDelegate.h file and editing the @interface line to read: @interface WebBrowserTutorialAppDelegate : NSObject <UIWebViewDelegate> { What we have done is to make the main AppDelegate a delegate for the UIWebView as well. Now we need to set our webView to have the main AppDelegate as its delegate, you can do this by opening up WebBrowserTutorialAppDelegate.m and putting the following line just inside theapplicationDidFinishLaunching function: webView.delegate = self; That is all pretty self explanatory, it just sets the delegate of our webView to self, which in this case is our main application delegate. Now we are pretty much done, we just need to add the function to catch the link clicks. To do this we need to add a new function, copy the content below to the WebBrowserTutorialAppDelegate.m file: - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = request.URL; NSString *urlString = url.absoluteString; NSLog(urlString); return YES; } This function will catch all requests and allow you to either manipulate them and pass them on or to perform your own custom action and stop the event from bubbling. The first line gets the URL of the request, this is the contents inside the href attribute in the anchor tag. The next line converts the URL to a string so we can log it out. You can access many parts of the NSURL, here are some of them and brief description of what they do. * absoluteString - An absolute string for the URL. Creating by resolving the receiver’s string against its base. * absoluteURL - An absolute URL that refers to the same resource as the receiver. If the receiver is already absolute, returns self. * baseURL - The base URL of the receiver. If the receiver is an absolute URL, returns nil. * host - The host of the URL. * parameterString - The parameter string of the URL. * password - The password of the URL (i.e. http://user:pass@www.test.com would return pass) * path - Returns the path of a URL. * port - The port number of the URL. * query - The query string of the URL. * relativePath - The relative path of the URL without resolving against the base URL. If the receiver is an absolute URL, this method returns the same value as path. * relativeString - string representation of the relative portion of the URL. If the receiver is an absolute URL this method returns the same value as absoluteString. * scheme - The resource specifier of the URL (i.e. http, https, file, ftp, etc). * user - The user portion of the URL. Then the third line simply logs the URL to the console, so you will new to open up the console while you run this in the simulator to see the results. Finally the forth line returns YES, this will allow the UIWebView to follow the link, if you would just like to catch a link and stop the UIWebView from following it then simply return NO. UIBUtton title image 不能同時顯示 [ leftbutton setTitle:_(@"About") forState:UIControlStateNormal ]; [ leftbutton setImage:image forState:UIControlStateNormal ]; 不能同時顯示。 其餘控件如:UINavigatonItem 不要在語言包裏面設置空格 有時,爲了界面的須要,咱們不要在語言包裏面加空格,要在程序中進行控制。 buttonTitle = [ NSString stringWithFormat:@" %@", _(@"updateWeb") ]; NSNotificationCenter 帶參數發送 MPMoviePlayerController* theMovie = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[[tableTitles objectForKey:keyIndex] objectAtIndex:row] objectAtIndex:3] ]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie]; [theMovie play]; -(void)myMovieFinishedCallback:(NSNotification*)aNotification { MPMoviePlayerController *theMovie = [aNotification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie]; // Release the movie instance [theMovie release]; } ------------ MPMoviePlayerController* theMovie = [[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[[tableTitles objectForKey:keyIndex] objectAtIndex:row] objectAtIndex:3] ]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie userInfo:dic]; [theMovie play]; -(void)myMovieFinishedCallback:(NSNotification*)aNotification { MPMoviePlayerController *theMovie = [aNotification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie]; // Release the movie instance [theMovie release]; } 延時一段時間執行某一函數 [self performSelector:@selector(dismissModal) withObject:self afterDelay:1.0]; 無99美金證書聯機開發 第一步:進入 cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.1.sdk/ sudo vi SDKSettings.plist,將CODE_SIGNING_REQUIRED的值改爲NO. 保存後退出. 第二步:從新啓動XCode項目. 第三步:右擊項目GetInfo.將Code Signing下的Code Signing Identity值設置成Don't Code Sign, 將Code Signing Identity下的Any iOS Device的值設置成空. 獲取IOS設備的基本信息 系統惟一標識 是什麼設備:iPad仍是iPhone等 iOS版本號 系統名稱 [[UIDevice currentDevice] uniqueIdentifier], [[UIDevice currentDevice] localizedModel], [[UIDevice currentDevice] systemVersion], [[UIDevice currentDevice] systemName], [[UIDevice currentDevice] model]]; 用NSDateFormatter調整時間格式的代碼 在開發iOS程序時,有時候須要將時間格式調整成本身但願的格式,這個時候咱們能夠用NSDateFormatter類來處理。 例如: //實例化一個NSDateFormatter對象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //設定時間格式,這裏能夠設置成本身須要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //用[NSDate date]能夠獲取系統當前時間 NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]]; //輸出格式爲:2010-10-27 10:22:13 NSLog(@」%@」,currentDateStr); //alloc後對不使用的對象別忘了release [dateFormatter release]; UIView設置成圓角方法 m_mainImgView.layer.cornerRadius = 6; m_mainImgView.layer.masksToBounds = YES; iPhone裏的frame和bounds區別 Objective-C內存管理 在使用Objective-C的工做中內存管理是首先要學會的一項技能,是如此重要,就比如是男人就要追漂亮姑娘同樣~~下面就來聊聊Apple官網上的內存管理的事情。 Objective-C的對象內存管理是一件很是有意思的事情,由其是在iPhone嵌入式設備中. 想玩的省心點,就得熟知它的管理規則,由其是內存的管理機制。瞭解它的品性了才能在Cocoa的世界裏如魚得水。不然,反之(如水得魚!!^_^)。 首先,要牢記Apple的官網上的內存管理三定律: 1,一個對象能夠有一個或多個擁有者 2,當它一個擁有都都沒有時,它就會被回收 3,若是想保留一個對象不被回收,你就必需成爲它的擁有者 全部內存管理的原則全在這裏!! 簡單??哈哈! 名人曰:「大道至簡」 這兒玩意兒提及來比過家家還容易,但其實有些事情真正作起來並非簡單的事兒~~ 我們首先來講怎麼樣才能成爲一個對象的擁有者。Cocoa提供了一個機制叫"reference counting",翻譯過來就是「關聯記數器」(本身翻譯的,真不知叫啥,若是有官方的翻譯請通知我)。每個對象都有一個關聯記數的值。當它被建立時,它的值爲「1」。當值減小到「0」時,就會被回收(調用它的deallocate方法,若是沒有寫,則調用從NSObject繼承而來的回收方法,下文有說,必定要重寫該方法)。如下幾個方法能夠操做這個記數: 1,alloc 爲對象分配內存,記數設爲「1」,並返回此對象。 2,copy 複製一個對象,此對象記數爲「1」,返回此對象。你將成爲此克隆對象的擁有者 3,retain 對象「關聯記數」加「1」,併成爲此對象的擁有者。 4,release 對象「關聯記數」減「1」,並丟掉此對象。 5,autorelease 在將來的某一時刻,對象「關聯記數」減「1」。並在將來的某個時間放棄此對象。 有了上面的幾個方法(固然這也是全部的內存操做的方法,簡單吧,哈哈哈)你就能夠隨意操做一個對象的記數。並部分或徹底的控制它的生命週期。但實際應用中,隨意亂寫上面的任何一個方法均可能會帶來嚴重的內存泄露。混亂的內存分配等於沒完沒了的麻煩工做,你不想在情人節的日子還在爲記數之類的鳥問題而丟了老婆吧~~哈哈哈,爲了美麗溫柔賢惠又善解人意的準老婆請牢記如下四條: 1,一個代碼塊內要確保copy, alloc 和 retain 的使用數量與 release 和 autorelease 的數量。 2,在使用以「alloc」或「new」開頭或包含「copy」的方法,或「retain」一個對象時,你就會變爲它的擁有者。 3,實現「dealloc」方法,並施放全部的實例變量。(其實這裏還有不少的巧兒門!!) 4,永不本身調用「dealloc」方法,這是系統當「retain」減到「0」時,自動調用的。手動調用會引發retain count記數錯誤(多一次的release)。 其實作到這些也不難, retain count 增長與減小的方法對應,板丁板作到了就好了。 來自:http://blog.csdn.net/dboylx/archive/2009/02/13/3888746.aspx iphone更改鍵盤右下角按鍵的type 以UISearchBar爲例。 建立mySearchBar: mySearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0,320, SEARCH_HEIGHT)]; mySearchBar.placeholder = curPath; [mySearchBar setDelegate:self]; //tableView.tableHeaderView =mySearchBar; [self.view addSubview:mySearchBar]; 更改按鍵的keyType(默認是return,這裏將它更改爲done,固然還能夠更改爲其餘的): UITextField *searchField = [[mySearchBar subviews] lastObject]; [searchField setReturnKeyType:UIReturnKeyDone]; [mySearchBar release];