您好,欢迎访问一九零五行业门户网

iOS 开发百问(7)

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)的内容。
其它类似信息

推荐信息