71、如何让uiwebview的大小符合html的内容?
在ios5中,这很简单,设置webview的委托,然后在委托中实现didfinishload:方法:
-(void)webviewdidfinishload:(uiwebview*)webview{
cgsizesize=webview.scrollview.contentsize;//ios5+
webview.bounds=cgrectmake(0,0,size.width,size.height);
}
72、窗口中有多个responder,如何快速释放键盘
[[uiapplicationsharedapplication]sendaction:@selector(resignfirstresponder)to:nilfrom:nilforevent:nil];
这样,可以一次性让所有responder的失去焦点。
73、如何让uiwebview能通过“捏合”手势进行缩放?
使用如下代码:
webview=[[uiwebviewalloc]init];
webview.autoresizingmask=(uiviewautoresizingflexiblewidth|uiviewautoresizingflexibleheight);
webview.scalespagetofit=yes;
webview.multipletouchenabled=yes;
webview.userinteractionenabled=yes;
74、undefinedsymbols:_kcgimagesourceshouldcache、_cgimagesourcecreatewithdata、_cgimagesourcecreateimageatindex
没有导入imageio.framework。
75、expectedmethodtoreaddictionaryelementnotfoundonobjectoftypensdictionary
sdk6.0开始对字典增加了“下标”索引,即通过dictionary[@"key"]的方式检索字典中的对象。但在sdk5.0中,这是非法的。你可以在项目中新建一个头文件nsobject+subscripts.h来解决这个问题,内容如下:
#if__iphone_os_version_max_allowed<60000
@interfacensdictionary(subscripts)
-(id)objectforkeyedsubscript:(id)key;
@end
@interfacensmutabledictionary(subscripts)
-(void)setobject:(id)objforkeyedsubscript:(id<nscopying>)key;
@end
@interfacensarray(subscripts)
-(id)objectatindexedsubscript:(nsuinteger)idx;
@end
@interfacensmutablearray(subscripts)
-(void)setobject:(id)objatindexedsubscript:(nsuinteger)idx;
@end
#endif
76、错误:-[mknetworkenginefreezeoperations]:messagesenttodeallocatedinstance0x1efd4750
这是一个内存管理错误。mknetwork框架支持arc,本来不应该出现内存管理问题,但由于mknetwork中的一些bug,导致在mknetworkengine不被设置为strong属性时出现该问题。建议mknetworkengine对象设置为viewcontroller的strong属性。
77、uiimagepickercontrollersourcetypesavedphotosalbum和uiimagepickercontrollersourcetypephotolibrary的区别
uiimagepickercontrollersourcetypephotolibrary表示整个照片库,允许用户选择所有的相册(包括相机胶卷),而uiimagepickercontrollersourcetypesavedphotosalbum仅包括相机胶卷。
78、警告“prototypetablecellsmusthaveresueidentifiers”
prototypecell(ios5模板单元格)的identidfier属性未填写,在属性模板中填写即可。
79、如何读取info.plist中的值?
以下示例代码读取了info.plist中的urlschemes:
//theinfo.plistisconsideredthemainbundle.
mainbundle=[nsbundlemainbundle];
nsarray*types=[mainbundleobjectforinfodictionarykey:@"cfbundleurltypes"];
nsdictionary*dictionary=[typesobjectatindex:0];
nsarray*schemes=[dictionaryobjectforkey:@"cfbundleurlschemes"];
nslog(@"%@",[schemesobjectatindex:0]);
80、如何让ationsheet不自动解散?
uiactionsheet无论点击什么按钮,最终都会自动解散。最好的办法是子类化它,增加一个noautodismiss属性并覆盖dismisswithclickedbuttonindex方法,当此属性为yes时,不进行解散动作,为no时调用默认的dismisswithclickedbuttonindex:
#import<uikit/uikit.h>
@interfacemyalertview:uialertview
@property(nonatomic,assign)boolnoautodismiss;
@end
#import"myalertview.h"
@implementationmyalertview
-(void)dismisswithclickedbuttonindex:(nsinteger)buttonindexanimated:(bool)animated{
if(self.noautodismiss)
return;
[superdismisswithclickedbuttonindex:buttonindexanimated:animated];
}
@end
81、在执行rsa_public_encrypt函数时崩溃
这个问题很奇怪。使用两台设备,一台系统为6.1,一台系统为6.02,同样的代码在6.02版本中一切正常,在6.1版本中导致程序崩溃:
unsignedcharbuff[2560]={0};
intbuffsize=0;
buffsize=rsa_public_encrypt(strlen(cleartext),
(unsignedchar*)cleartext,buff,rsa,padding);
问题在于这一句:
buffsize=rsa_public_encrypt(strlen(cleartext),
(unsignedchar*)cleartext,buff,rsa,padding);
6.1系统ipad为3g版,由于使用的3g网络(联通3gnet)信号不稳定,导致rsa公钥经常性取不到,故rsa参数出现nil。而6.0系统ipad为wifi版,信号稳定,故无此问题。解决方法是检查rsa参数的有效性。
82、警告:uitextalignmentcenterisdeprecatedinios6
nstextalignmentcenter已经被uitextalignmentcenter所替代。类似的替代还有一些,你可以使用以下宏:
#ifdef__iphone_6_0//ios6andlater
#defineuitextalignmentcenter(uitextalignment)nstextalignmentcenter
#defineuitextalignmentleft(uitextalignment)nstextalignmentleft
#defineuitextalignmentright(uitextalignment)nstextalignmentright
#defineuilinebreakmodetailtruncation(uilinebreakmode)nslinebreakbytruncatingtail
#defineuilinebreakmodemiddletruncation(uilinebreakmode)nslinebreakbytruncatingmiddle
#endif
83、xcode5中无法设置-fno-objc-arc
xcode5默认使用arc,同时隐藏了compilesources中的“compilerflags”列,因此你无法设置.m文件的-fno-objc-arc选项。要显示.m文件的compilerflags列,你可以使用菜单“view->utilities->hideutilities”来暂时关闭右侧的utilities窗口,以显示compilerflags列,这样你就可以设置.m文件的-fno-objc-arc标志。
84、警告:‘abaddressbookcreate'isdeprecated:firstdeprecatedinios6.0
ios6.0以后该方法被抛弃,用abaddressbookcreatewithoptions方法替代:
cferrorref*error=nil;
abaddressbookrefaddressbook=abaddressbookcreatewithoptions(null,error);
85、ios6.0以后如何读取手机通讯录?
ios6以后,addressbook框架发生了改变,尤其是app访问手机通讯录需要获得用户授权。因此,除了需要使用新的abaddressbookcreatewithoptions初始化方法之外,我们还需要使用addressbook框架新的abaddressbookrequestaccesswithcompletion方法,用以获知用户是否授权:
+(void)fetchcontacts:(void(^)(nsarray*contacts))successfailure:(void(^)(nserror*error))failure{
#ifdef__iphone_6_0
if(abaddressbookrequestaccesswithcompletion){
cferrorreferr;
abaddressbookrefaddressbook=abaddressbookcreatewithoptions(null,&err);
abaddressbookrequestaccesswithcompletion(addressbook,^(boolgranted,cferrorreferror){
//abaddressbookdoesn'tgauranteeexecutionofthisblockonmainthread,butwewantourcallbackstobe
dispatch_async(dispatch_get_main_queue(),^{
if(!granted){
failure((__bridgenserror*)error);
}else{
readaddressbookcontacts(addressbook,success);
}
cfrelease(addressbook);
});
});
}
#else
//onios<6
abaddressbookrefaddressbook=abaddressbookcreate();
readaddressbookcontacts(addressbook,success);
cfrelease(addressbook);
}
#endif
}
这个方法有两个块参数success和failure,分别用于执行用户授权访问的两种情况:同意和不同意。
在代码调用abaddressbookrequestaccesswithcompletion函数时,第2个参数是一个块,该块的granted参数用于告知用户是否同意。如果granted为no(不同意),我们调用failure块。如果granted为yes(同意),我们将调用readaddressbookcontacts函数,进一步读取联系人信息。
readaddressbookcontacts声明如下:
staticvoidreadaddressbookcontacts(abaddressbookrefaddressbook,void(^completion)(nsarray*contacts)){
//dostuffwithaddressbook
nsarray*contacts=(nsarray*)cfbridgingrelease(abaddressbookcopyarrayofallpeople(addressbook));
completion(contacts);
}
首先从addressbook中获取所有联系人(结果放到一个nsarray数组中),然后调用completion块(即fetchcontacts方法的success块)。在completion中我们可以对数组进行迭代。
一个调用fetchcontacts方法的例子:
+(void)getaddressbook:(void(^)(nsarray*))completion{
[selffetchcontacts:^(nsarray*contacts){
nsarray*sortedarray=[contactssortedarrayusingcomparator:^(ida,idb){
nsstring*fullname1=(nsstring*)cfbridgingrelease(abrecordcopycompositename((__bridgeabrecordref)(a)));
nsstring*fullname2=(nsstring*)cfbridgingrelease(abrecordcopycompositename((__bridgeabrecordref)(b)));
intlen=[fullname1length]>[fullname2length]?[fullname2length]:[fullname1length];
nslocale*local=[[nslocalealloc]initwithlocaleidentifier:@"zh_hans"];
return[fullname1compare:fullname2options:nscaseinsensitivesearchrange:nsmakerange(0,len)locale:local];
}];
completion(sortedarray);
}failure:^(nserror*error){
dlog(@"%@",error);
}];
}
即在fetchcontacts的完成块中对联系人姓名进行中文排序。最后调用completion块。在fetchcontacts的错误块中,简单打印错误信息。
调用getaddressbook的示例代码如下:
[addressbookhelpergetaddressbook:^(nsarray*node){
nslog(@"%@",nsarray);
}];
86、arc警告:performselectormaycausealeakbecauseitsselectorisunknown
这个是arc下特有的警告,用#pragmaclangdiagnostic宏简单地忽略它即可:
#pragmaclangdiagnosticpush
#pragmaclangdiagnosticignored"-warc-performselector-leaks"
[targetperformselector:selwithobject:[nsnumbernumberwithbool:yes]];
#pragmaclangdiagnosticpop
87、'libxml/htmlparser.h'filenotfound
导入libxml2.dylib后出现此错误,尤其是使用asihttp框架的时候。在buildsettings的headersearchpaths列表中增加“${sdk_dir}/usr/include/libxml2”一项可解决此问题。
所谓"$(sdk_root)"是指编译目标所使用的sdk的目录,以iphonesdk7.0(真机)为例,是指/applications/xcode.app/contents/developer/platforms/iphoneos.platform/developer/sdks/iphoneos7.0.sdk目录。
注意,似乎xcode4.6以后“userheadersearchpaths”(或者“alwayssearchuserpaths”)不再有效,因此在“userheadersearchpaths”中配置路径往往是无用的,最好是配置在“headersearchpaths”中。
88、错误:-[uitableviewdequeuereusablecellwithidentifier:forindexpath:]:unrecognizedselector
这是sdk6以后的方法,在ios5.0中这个方法为:
[uitableviewdequeuereusablecellwithidentifier:]
89、@yes语法在ios5中无效,提示错误:unexpectedtypename'bool':expectedexpression
在ios6中,@yes定义为:
#defineyes((bool)1)
但在ios5中,@yes被少写了一个括号:
#defineyes(bool)1
因此@yes在ios5中的正确写法应当为@(yes)。为了简便,你也可以在.pch文件中修正这个bug:
#if__has_feature(objc_bool)
#undefyes
#undefno
#defineyes__objc_yes
#defineno__objc_no
#endif
以上就是ios 开发百问(7)的内容。