iOS 開發百問(6)

來源:互聯網
上載者:User

iOS 開發百問(6)

61、警告“addexplicit braces to avoid dangling else”

所謂“危險的else”是類似這樣的代碼:

if(a== 10)

printf("TEN");

else

printf("NOT TEN");

a = 100;

編譯器認為你的else 子句導致語義不清,你到底是什麼意思?是無論 a 是否等於10 , if 執行完之後都要將 a 賦值為100,還是只想在 else 子句(即 a 不等於10 的時候)中將 a 賦值為 100?

如果是前者,正確的寫法應該是:

if(a== 10) {

printf("TEN");

}else{

printf("NOT TEN");

}

a= 100;

如果是後者,正確的寫法應該是:

if(a== 10) {

printf("TEN");

}else{

printf("NOT TEN");

a = 100;

}

當然,對於c/c++/java 編譯器來說,這隻是一個小問題,並不會導致無法編譯。編譯器實際上是傾向於前者的,它自動按第一種情況處理。但它會警告你這是一種不好的代碼風格,你可以用#pragma clang diagnostic ignored "-Wswitch" 宏忽略該警告,或者將編譯選項 MissingBraces and Parentheses 設定為 NO。

62、iPad模擬器不顯示 Home 鍵

從Xcode 4.3 開始,為了獲得更大的使用者可用空間,iPad 模擬器不顯示 Home 鍵。 你可以通過菜單“ 硬體 > 首頁”或者快速鍵??H 來代替 Home 鍵。

63、Novisible @interface for 'NSURL' declares the selector 'query'

iOS6 中,該方法被拋棄,請用 NSURL+Parameters 替代。

64、certificateidentity 'iphone distribution' appears more than once

這是認證重複的錯誤,需要將鑰匙串裡重複的認證刪掉編譯才能通過。但是,如果你重啟Xcode ,會發現之前刪除的認證又回來了。但當重新啟動Xcode時,Xcode裡的認證會被導進鑰匙串,所以僅僅是刪除鑰匙串中重複認證是無效的。

相信 許多同學對 Xcode 的這個 Bug 深惡痛絕了,但除了反覆地(但是徒勞地)從鑰匙串中刪除認證,也沒有別的辦法了。其實,也不能光怪 Xcode,而是跟”iPhone 配置使用工具“也有一定的關係。

Xcode中的這些“殘留”認證不以常規的形式存在。如果你安裝了“iPhone 配置工具 + 生產力”,這些認證實際上存在於/Users/km-cn/Library/MobileDevice/Applications/目錄下的.app 檔案中,這些.app 實際上是 “iPhone配置工具 + 生產力”——“應用程式”中的所匯入的 app。你可以用Finder ——“顯示包內容”來查看.app 。其中一個名叫“embedded.mobileprovision”的檔案,就是“殘留”的重複認證。你可以逐一刪除這些 .app,也可以乾脆把該目錄下的所有.app 都刪除(反正只要專案檔存在,你隨時可以編譯出這些 .app並匯入到“iPhone 配置工具 + 生產力”中)。最後,還要將 Orgnizer 中的重複認證也刪除,然後重啟Xcode。

65、Application Identifier 'com. ydtf.*' which doesn't match the current setting'com.ydtf.dlt'

如你所見,這兩個Application ID 絕對是匹配的(*表示萬用字元)。但這個莫名的錯誤會導致你始終不能編譯。這絕對是 Xcode 的另一個 Bug,先將 CodeSigning 修改為 Don't Code Sign,Build,然後再修改回正確的簽名 Build。

66、Theidentity used to sign the executable is no longer valid.

由於前面的簽名問題導致不能Archive。解決方式見問題 65。

67、在iPad 中使用 presentModalViewController 設定快顯視窗的大小

TestViewController*testVC = [[TestViewController alloc] initWithNibName:@"TestViewController"bundle:nil];

testVC.modalPresentationStyle= UIModalPresentationFormSheet;

testVC.modalTransitionStyle= UIModalTransitionStyleCrossDissolve;

[selfpresentModalViewController:testVC animated:YES];

testVC.view.superview.frame= CGRectMake(0, 0, 649, 397);//it's important to do this afterpresentModalViewController

testVC.view.superview.center = self.view.center;

注意://it'simportant to do this after presentModalViewController。即一定要在[selfpresentModalViewController:testVC animated:YES];之後設定frame的大小!

68、在iPad 中定製 ActionSheet 的按鈕和Popover 箭頭方向。

ActionSheet在 iPad 上以Popover的方式顯示。預設不會顯示cancelButton(SDK用Popover之外的地區代替cancelButton,使用者只要點擊Popover之外的地區就等同點擊取消按鈕)。如果你這樣init一個ActionSheet:

UIActionSheet* sheet=[[UIActionSheet alloc]initWithTitle:nil

delegate:self

cancelButtonTitle:@"cancel"

destructiveButtonTitle:@"ok"

otherButtonTitles:nil];

則最終只有紅色的destructiveButton 會顯示。

如果你非要顯示cancelButton,則可以這樣幹:

UIActionSheet* sheet=[[UIActionSheet alloc]initWithTitle:nil

delegate:self

cancelButtonTitle:nil

destructiveButtonTitle:nil

otherButtonTitles:@"cancel",@"ok",nil];

// sheet.cancelButtonIndex=0;

sheet.destructiveButtonIndex=1;

指定destructiveButtonIndex之後,該按鈕被顯示為紅色。

但千萬不要指定cancelButtonIndex,因為在iPad上cancelButton會被移除。

在iPad中,SDK沒有提供可以修改 actionSheet 的箭頭方向的API,系統自動判斷箭頭顯示的方向。但我們可以利用showFromRect的第1個參數來改變箭頭的方向:

CGRect r=sender.bounds;

r.size.width=2*self.view.bounds.size.width;

r.origin.x=-self.view.bounds.size.width+sender.bounds.size.width/2+sender.frame.origin.x;

[sheet showFromRect:r inView:sender animated:YES];

這樣就將原來的左箭頭,換成了上箭頭。

其實iOS 在判斷 actionSheet 彈出方向時的邏輯很簡單,哪邊有“足夠”的空間,它就往哪邊彈出。當我們利用showFromRect的第1個參數將3個方向都“堵死”後,它就只能老老實實地從我們想要的方向彈出了。

69、在 ASINetworkQueue 中 setShowAccurateProgress=YES 不起作用

在 networkQueue.showAccurateProgress= YES之前加入 request.showAccurateProgress= YES ,否則showAccurateProgress 不會生效。範例程式碼:

equest.showAccurateProgress=YES;

networkQueue.showAccurateProgress=YES;

[networkQueue setSuspended:YES];

[networkQueue addOperation:request];

networkQueue.uploadProgressDelegate=self;

[networkQueue go];

此外,由於 CFNework 中的一個 Bug,對於小於128K的資料,無法跟蹤其上傳/下載的精確進度。

70、如何設定 UIWebView 背景色為透明?

在IB中設定 UIWebView 的 Background 屬性為 Clear Color 並不能使其背景透明。要達到這個目的,你需要使用以下兩句:

[webView setBackgroundColor:[UIColor clearColor]];

[webView setOpaque:NO];

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.