首頁  >  文章  >  後端開發  >  iOS 開發百問(6)

iOS 開發百問(6)

黄舟
黄舟原創
2017-01-20 09:38:271579瀏覽

61、警告「addexplicit braces to avoid dangling else」
所謂「危險的else」是類似這樣的程式碼:
i

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

以上就是iOS 开发百问(6)的内容,更多相关内容请关注PHP中文网(www.php.cn)!




陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn