iOS 开发百问(7)

71、如何让UIWebView的大小符合HTML的内容?

在 iOS 5中,这很简单,设置 webview 的委托,然后在委托中实现didFinishLoad:方法:

- (void)webViewDidFinishLoad:(UIWebView *)webView{

CGSize size=webView.scrollView.contentSize;//iOS 5+

webView.bounds=CGRectMake(0,0,size.width,size.height);

}

72、窗口中有多个Responder,如何快速释放键盘

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

这样,可以一次性让所有Responder 的失去焦点。

73、如何让 UIWebView 能通过“捏合”手势进行缩放?

使用如下代码:

webview=[[UIWebView alloc]init];

webview.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);

webview.scalesPageToFit=YES;

webview.multipleTouchEnabled=YES;

webview.userInteractionEnabled=YES;

74、Undefined symbols:_kCGImageSourceShouldCache、_CGImageSourceCreateWithData、_CGImageSourceCreateImageAtIndex

没有导入 ImageIO.framework。

75、 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
 

76、错误:-[MKNetworkEngine freezeOperations]: message sent to deallocated instance0x1efd4750

这是一个内存管理错误。MKNetwork 框架支持 ARC,本来不应该出现内存管理问题,但由于 MKNetwork 中的一些 Bug,导致在 MKNetworkEngine 不被设置为 strong 属性时出现该问题。建议 MKNetworkEngine 对象设置为 ViewController 的 strong 属性。
 

77、UIImagePickerControllerSourceTypeSavedPhotosAlbum和 UIImagePickerControllerSourceTypePhotoLibrary的区别

UIImagePickerControllerSourceTypePhotoLibrary 表示整个照片库,允许用户选择所有的相册(包括相机胶卷),而UIImagePickerControllerSourceTypeSavedPhotosAlbum仅包括相机胶卷。

78、警告“Prototype tablecells must have resue identifiers”

Prototype cell(iOS 5 模板单元格)的 Identidfier 属性未填写,在属性模板中填写即可。

79、如何读取 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

81、在执行 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 参数的有效性。

82、警告: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

83、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 标志。

84、警告:‘ABAddressBookCreate‘is deprecated:first deprecated in iOS 6.0

iOS6.0以后该方法被抛弃,用 ABAddressBookCreateWithOptions方法替代:

CFErrorRef* error=nil;

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);

85、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((__bridge ABRecordRef)(a)));

NSString* fullName2=(NSString*)CFBridgingRelease(ABRecordCopyCompositeName((__bridge ABRecordRef)(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);

}];

86、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

87、‘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”中。

88、错误:-[UITableViewdequeueReusableCellWithIdentifier:forIndexPath:]: unrecognized selector

这是 SDK 6 以后的方法,在 iOS 5.0 中这个方法为:

[UITableViewdequeueReusableCellWithIdentifier:]

89、@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

时间: 2024-10-27 11:15:00

iOS 开发百问(7)的相关文章

iOS 开发百问(3)

22.解决 messagesent to deallocated instance 0x52cc690 错误 当试图对某个对象进行赋值操作的时候出现这个错误,如: tfContent.text=bodyText; 此时,你可以打开NSZombieEnable选项,则console会有如下输出: ***-[CFString _isNaturallyRTL]: message sent to deallocated instance 0x52cc690 说明_isNaturallyRTL消息被发送给

iOS开发百问(4)

32.UIImage+Scale缩放图片 UIImage可以加载图片,但是我们想要得到一张缩小或放大的图片,利用UIImage不能做到,下面我们添加一个UIImage的分类,用来实现UIImage中图片的放大和缩小. 首先,创建一个UIImage+Scale类. 然后,实现该类的方法: #import <UIKit/UIKit.h> @interface UIImage (scale) -(UIImage*)scaleToSize:(CGSize)size; @end #import &quo

iOS 开发百问(5)

42. 警告:Multiplebuild commands for output file target引用了名字反复的资源 找到当前的target,展开之后.找到CopyBundle Resources栏目.然后在里面找到反复名字的资源.删除不要的那个就可以 43.签名错误:Provisioningprofile can't be found 在Xcode中当你在更新了你得证书而再又一次编译你的程序,真机调试一直会出现Code Sign error: Provisioning profile

iOS 开发百问(10)

121.如何将字典/数组转换为字符串? NSString* id2json(id dicOrArr){ NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dicOrArr options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about thereadability of the generated string error:

iOS 开发百问(8)

90.找不到 Profile 错误"CodeSign error: no provisioning profile at path '/Users/yourname/Library/MobileDevice/ProvisioningProfiles/F87A055A-EC0D-4F19-A015-57AB09DEBECB.mobileprovision'" 在 ProjectNavigator 中选择你的项目,使用 View ->Version Editor -> Show

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 不等

iOS开发百问(11)

131.如何限制ScrollView在某个方向上不可滚动? 例如,要限制x方向上不可滚动,可以实现UIScrollViewDelegate协议方法: func scrollViewDidScroll(scrollView: UIScrollView) { ifabs(scrollView.contentOffset.x) > 0 { scrollView.contentOffset= CGPointMake(0, scrollView.contentOffset.y) } } 132.如何在Sw

iOS 开发百问(9)

101.编译错误:ld: library notfound for -lPods 当项目中使用了 cocoaPods 时,经常出现此错误(通常是 release 的时候). 这是由于 pod install 后,cocoaPods 会创建一个新的 workspace.你必须关闭项目并重新打开.问题即可解决. 102.为什么 iOS 的时间总是比真实时间慢8小时 例如,一个北京时间"2014-4-4 22:00"(字符串),需要转换成 NSDate.字符串转换成 NSDate 一般是通过

k3 Bos开发百问百答

          K/3 BOS开发百问百答   (版本:V1.1)           K3产品市场部       目录 一.基础资料篇__ 1 [摘要]bos基础资料的显示问题_ 1 [摘要]单据自定义无法看到bos定义的基础资料_ 1 [摘要]在调出基础资料序时簿时,过滤出我需要的基础资料_ 1 [摘要]bos定义的基础资料能否做到按名称而不是按代码进行自动匹配_ 1 二.业务单据篇__ 2 [摘要]是否支持多插件和数据授权_ 2 [摘要]K3BOS单据(新)中的数量字段怎样才能控制到两