7一、如何讓UIWebView的大小符合HTML的內容?node
在 iOS 5中,這很簡單,設置 webview 的委託,而後在委託中實現didFinishLoad:方法:web
- (void)webViewDidFinishLoad:(UIWebView *)webView{express
CGSize size=webView.scrollView.contentSize;//iOS 5+數組
webView.bounds=CGRectMake(0,0,size.width,size.height);網絡
}app
7二、窗口中有多個Responder,如何快速釋放鍵盤框架
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];async
這樣,能夠一次性讓全部Responder 的失去焦點。ide
7三、如何讓 UIWebView 能經過「捏合」手勢進行縮放?函數
使用以下代碼:
webview=[[UIWebView alloc]init];
webview.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
webview.scalesPageToFit=YES;
webview.multipleTouchEnabled=YES;
webview.userInteractionEnabled=YES;
7四、Undefined symbols:_kCGImageSourceShouldCache、_CGImageSourceCreateWithData、_CGImageSourceCreateImageAtIndex
沒有導入 ImageIO.framework。
7五、 expectedmethod to read dictionary element not found on object of type nsdictionary
SDK 6.0 開始對字典增長了「下標」索引,即經過 dictionary[@"key"] 的方式檢索字典中的對象。但在 SDK 5.0 中,這是非法的。你能夠在項目中新建一個頭文件 NSObject+subscripts.h 來解決這個問題 ,內容以下:
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
@interface NSDictionary(subscripts)
- (id)objectForKeyedSubscript:(id)key;
@end
@interface NSMutableDictionary(subscripts)
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
@end
@interface NSArray(subscripts)
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
@end
@interface NSMutableArray(subscripts)
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
@end
#endif
7六、錯誤:-[MKNetworkEngine freezeOperations]: message sent to deallocated instance0x1efd4750
這是一個內存管理錯誤。MKNetwork 框架支持 ARC,原本不該該出現內存管理問題,但因爲 MKNetwork 中的一些 Bug,致使在 MKNetworkEngine 不被設置爲 strong 屬性時出現該問題。建議 MKNetworkEngine 對象設置爲 ViewController 的 strong 屬性。
7七、UIImagePickerControllerSourceTypeSavedPhotosAlbum和 UIImagePickerControllerSourceTypePhotoLibrary的區別
UIImagePickerControllerSourceTypePhotoLibrary 表示整個照片庫,容許用戶選擇全部的相冊(包括相機膠捲),而UIImagePickerControllerSourceTypeSavedPhotosAlbum僅包括相機膠捲。
7八、警告「Prototype tablecells must have resue identifiers」
Prototype cell(iOS 5 模板單元格)的 Identidfier 屬性未填寫,在屬性模板中填寫便可。
7九、如何讀取 info.plist 中的值?
如下示例代碼讀取了info.plist 中的 URL Schemes:
// The Info.plist isconsidered the mainBundle.
mainBundle = [NSBundle mainBundle];
NSArray* types=[mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"];
NSDictionary* dictionary=[types objectAtIndex:0];
NSArray* schemes=[dictionary objectForKey:@"CFBundleURLSchemes"];
NSLog(@"%@",[schemes objectAtIndex:0]);
80、如何讓 AtionSheet 不自動解散?
UIActionSheet 不管點擊什麼按鈕,最終都會自動解散。最好的辦法是子類化它,增長一個 noAutoDismiss 屬性並覆蓋 dismissWithClickedButtonIndex 方法,當此屬性爲 YES 時,不進行解散動做,爲NO 時調用默認的 dismissWithClickedButtonIndex:
#import <UIKit/UIKit.h>
@interface MyAlertView : UIAlertView
@property(nonatomic, assign) BOOL noAutoDismiss;
@end
#import "MyAlertView.h"
@implementation MyAlertView
-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
if(self.noAutoDismiss)
return;
[super dismissWithClickedButtonIndex:buttonIndex animated:animated];
}
@end
8一、在執行 RSA_public_encrypt函數時崩潰
這個問題很奇怪。使用兩臺設備,一臺系統爲 6.1,一臺系統爲 6.02,一樣的代碼在 6.02 版本中一切正常,在 6.1 版本中致使程序崩潰:
unsigned char buff[2560]={0};
int buffSize = 0;
buffSize = RSA_public_encrypt ( strlen(cleartext),
(unsigned char*)cleartext, buff, rsa, padding );
問題在於這一句:
buffSize = RSA_public_encrypt ( strlen(cleartext),
(unsigned char*)cleartext, buff, rsa, padding );
6.1系統iPad爲 3G 版,因爲使用的 3G 網絡(聯通3gnet)信號不穩定,致使 rsa 公鑰常常性取不到,故 rsa 參數出現 nil。而 6.0 系統iPad爲wifi 版,信號穩定,故無此問題。解決方法是檢查 rsa 參數的有效性。
8二、警告:UITextAlignmentCenteris deprecated in iOS 6
NSTextAlignmentCenter 已經被 UITextAlignmentCenter 所替代。相似的替代還有一些,你可使用如下宏:
#ifdef __IPHONE_6_0 // iOS6 and later
# define UITextAlignmentCenter (UITextAlignment)NSTextAlignmentCenter
# define UITextAlignmentLeft (UITextAlignment)NSTextAlignmentLeft
# define UITextAlignmentRight (UITextAlignment)NSTextAlignmentRight
# define UILineBreakModeTailTruncation (UILineBreakMode)NSLineBreakByTruncatingTail
# defineUILineBreakModeMiddleTruncation (UILineBreakMode)NSLineBreakByTruncatingMiddle
#endif
8三、Xcode5 中沒法設置 -fno-objc-arc
Xcode5 默認使用 ARC,同時隱藏了Compile Sources 中的「 Compiler Flags」列,所以你沒法設置 .m 文件的 -fno-objc-arc 選項。要顯示.m 文件的 Compiler Flags列,你可使用菜單 「View->Utilities->Hide Utilities」來暫時關閉右側的 Utilities 窗口,以顯示 Compiler Flags 列,這樣你就能夠設置.m文件的 -fno-objc-arc 標誌。
8四、警告:‘ABAddressBookCreate'is deprecated:first deprecated in iOS 6.0
iOS6.0之後該方法被拋棄,用 ABAddressBookCreateWithOptions方法替代:
CFErrorRef* error=nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
8五、iOS6.0 之後如何讀取手機通信錄?
iOS 6之後,AddressBook 框架發生了改變,尤爲是app訪問手機通信錄須要得到用戶受權。所以,除了須要使用新的ABAddressBookCreateWithOptions 初始化方法以外,咱們還須要使用 AddressBook 框架新的 ABAddressBookRequestAccessWithCompletion 方法,用以獲知用戶是否受權 :
+ (void)fetchContacts:(void (^)(NSArray *contacts))successfailure:(void (^)(NSError *error))failure {
#ifdef __IPHONE_6_0
if (ABAddressBookRequestAccessWithCompletion) {
CFErrorRef err;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &err);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
// ABAddressBook doesn'tgaurantee execution of this block on main thread, but we want our callbacks tobe
dispatch_async(dispatch_get_main_queue(), ^{
if (!granted) {
failure((__bridge NSError *)error);
} else {
readAddressBookContacts(addressBook, success);
}
CFRelease(addressBook);
});
});
}
#else
// on iOS < 6
ABAddressBookRef addressBook = ABAddressBookCreate();
readAddressBookContacts(addressBook, success);
CFRelease(addressBook);
}
#endif
}
這個方法有兩個塊參數 success 和 failure,分別用於執行用戶受權訪問的兩種狀況:贊成和不一樣意。
在代碼調用 ABAddressBookRequestAccessWithCompletion函數時,第2個參數是一個塊,該塊的 granted 參數用於告知用戶是否贊成。若是 granted 爲No(不一樣意),咱們調用failure塊。 若是 granted 爲Yes(贊成),咱們將調用 readAddressBookContacts 函數,進一步讀取聯繫人信息。
readAddressBookContacts 聲明以下:
static voidreadAddressBookContacts(ABAddressBookRef addressBook, void (^completion)(NSArray *contacts)) {
// do stuff with addressBook
NSArray *contacts = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
completion(contacts);
}
首先從 addressBook 中獲取全部聯繫人(結果放到一個NSArray 數組中),而後調用 completion 塊(即 fetchContacts 方法的 success 塊)。在 completion 中咱們能夠對數組進行迭代。
一個調用 fetchContacts 方法的例子:
+(void)getAddressBook:(void(^)(NSArray*))completion{
[self fetchContacts:^(NSArray *contacts) {
NSArray *sortedArray=[contactssortedArrayUsingComparator:^(id a, id b) {
NSString* fullName1=(NSString*)CFBridgingRelease(ABRecordCopyCompositeName((__bridgeABRecordRef)(a)));
NSString* fullName2=(NSString*)CFBridgingRelease(ABRecordCopyCompositeName((__bridgeABRecordRef)(b)));
int len = [fullName1 length] > [fullName2 length]? [fullName2 length]:[fullName1 length];
NSLocale *local = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_hans"];
return [fullName1 compare:fullName2 options:NSCaseInsensitiveSearch range:NSMakeRange(0, len) locale:local];
}];
completion(sortedArray);
} failure:^(NSError *error) {
DLog(@"%@",error);
}];
}
即在 fetchContacts 的完成塊中對聯繫人姓名進行中文排序。最後調用 completion 塊。在 fetchContacts 的錯誤塊中,簡單打印錯誤信息。
調用 getAddressBook的示例代碼以下:
[AddressBookHelper getAddressBook:^(NSArray *node) {
NSLog(@"%@",NSArray);
}];
8六、ARC警告:PerformSelector may cause a leak because itsselector is unknown
這個是 ARC 下特有的警告,用#pragma clang diagnostic宏簡單地忽略它便可:
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Warc-performSelector-leaks"
[targetperformSelector:sel withObject:[NSNumber numberWithBool:YES]];
#pragma clang diagnostic pop
8七、'libxml/HTMLparser.h' file not found
導入 libxml2.dylib 後出現此錯誤,尤爲是使用 ASIHTTP 框架的時候。在 Build Settings的 Header SearchPaths 列表中增長「${SDK_DIR}/usr/include/libxml2」一項可解決此問題。
所謂 "$(SDK_ROOT)"是指編譯目標所使用的 SDK 的目錄,以 iPhone SDK 7.0 (真機)爲例,是指/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk目錄。
注意,彷佛 Xcode 4.6 之後「User Header Search Paths」(或者「Always Search User Paths」)再也不有效,所以在 「User HeaderSearch Paths」中配置路徑每每是無用的,最好是配置在「Header SearchPaths」中。
8八、錯誤:-[UITableViewdequeueReusableCellWithIdentifier:forIndexPath:]: unrecognized selector
這是 SDK 6 之後的方法,在 iOS 5.0 中這個方法爲:
[UITableViewdequeueReusableCellWithIdentifier:]
8九、@YES 語法在 iOS5 中無效,提示錯誤:Unexpected typename 'BOOL': expected expression
在 IOS6 中,@YES定義爲:
#define YES ((BOOL)1)
但在 iOS 5 中,@YES 被少寫了一個括號:
#define YES (BOOL)1
所以 @YES 在 iOS 5 中的正確寫法應當爲 @(YES)。爲了簡便,你也能夠在 .pch 文件中修正這個 Bug:
#if __has_feature(objc_bool)
#undef YES
#undef NO
#define YES __objc_yes
#define NO __objc_no
#endif