Maison  >  Article  >  développement back-end  >  Questions de développement iOS (7)

Questions de développement iOS (7)

黄舟
黄舟original
2017-01-20 09:41:151553parcourir

71. Comment rendre la taille de UIWebView conforme au contenu HTML ?
Dans iOS5, c'est très simple, définissez le délégué de webview, puis implémentez la méthode didFinishLoad: dans le délégué :

-(void)webViewDidFinishLoad:(UIWebView*)webView{
CGSizesize=webView.scrollView.contentSize;//iOS5+
webView.bounds=CGRectMake(0,0,size.width,size.height);
}

72. Il y a plusieurs répondeurs dans la fenêtre, comment. pour relâcher rapidement le clavier
[[UIApplicationsharedApplication]sendAction:@selector(resignFirstResponder)to:nilfrom:nilforEvent:nil];
De cette façon, tous les répondeurs peuvent perdre leur concentration en même temps.
73. Comment permettre à UIWebView de zoomer via le geste « pincer » ?
Utilisez le code suivant :

webview=[[UIWebViewalloc]init];
webview.autoresizingMask=(UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight);
webview.scalesPageToFit=YES;
webview.multipleTouchEnabled=YES;
webview.userInteractionEnabled=YES;

74, Symboles non définis :_kCGImageSourceShouldCache, _CGImageSourceCreateWithData, _CGImageSourceCreateImageAtIndex

ImageIO.framework n'est pas importé.

75. Méthode attendue pour lire un élément de dictionnaire introuvable sur un objet de type pendictionary

Le SDK 6.0 a ajouté un index "indice" au dictionnaire, c'est-à-dire la récupération des objets dans le dictionnaire via le dictionnaire [@"key"]. Mais dans le SDK5.0, c'est illégal. Vous pouvez créer un nouveau fichier d'en-tête NSObject subscripts.h dans le projet pour résoudre ce problème. Le contenu est le suivant :

#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. Erreur : -[MKNetworkEnginefreezeOperations]:messagesenttodeallocatedinstance0x1efd4750.
Il s'agit d'une erreur de gestion de la mémoire. Le framework MKNetwork prend en charge ARC et aucun problème de gestion de la mémoire ne devrait survenir. Cependant, en raison de certains bogues dans MKNetwork, ce problème se produit lorsque MKNetworkEngine n'est pas défini sur l'attribut strong. Il est recommandé que l'objet MKNetworkEngine soit défini sur l'attribut strong de ViewController.

77. La différence entre UIImagePickerControllerSourceTypeSavedPhotosAlbum et UIImagePickerControllerSourceTypePhotoLibrary
UIImagePickerControllerSourceTypePhotoLibrary représente l'intégralité de la bibliothèque de photos, permettant aux utilisateurs de sélectionner tous les albums photo (y compris la pellicule), tandis que UIImagePickerControllerSourceTypeSavedPhotosAlbum n'inclut que la pellicule.
78. Attention "Prototypetablecellsmusthaveresueidentifiers"
L'attribut Identifiant de Prototypecell (cellule modèle iOS5) n'est pas renseigné, remplissez-le simplement dans le modèle d'attribut.
79. Comment lire la valeur dans info.plist ?
L'exemple de code suivant lit les URLSchemes dans info.plist :

//TheInfo.plistisconsideredthemainBundle.
mainBundle=[NSBundlemainBundle];
NSArray*types=[mainBundleobjectForInfoDictionaryKey:@"CFBundleURLTypes"];
NSDictionary*dictionary=[typesobjectAtIndex:0];
NSArray*schemes=[dictionaryobjectForKey:@"CFBundleURLSchemes"];
NSLog(@"%@",[schemesobjectAtIndex:0]);

80 Comment empêcher ActionSheet de se dissoudre automatiquement ?
UIActionSheet sera finalement automatiquement ignoré, quel que soit le bouton sur lequel vous cliquez. La meilleure façon est de le sous-classer, d'ajouter un attribut noAutoDismiss et de remplacer la méthode dismissWithClickedButtonIndex. Lorsque cet attribut est OUI, aucune action de licenciement n'est effectuée. Lorsqu'il est NON, l'attribut dismissWithClickedButtonIndex est appelé :

#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. Crash lors de l'exécution de la fonction RSA_public_encrypt
Ce problème est très étrange. En utilisant deux appareils, un avec le système 6.1 et un avec le système 6.02, le même code, tout fonctionne bien dans la version 6.02, provoque le crash du programme dans la version 6.1 :

unsignedcharbuff[2560]={0};
intbuffSize=0;
buffSize=RSA_public_encrypt(strlen(cleartext),
(unsignedchar*)cleartext,buff,rsa,padding);

Le problème est celui-ci phrase :

buffSize=RSA_public_encrypt(strlen(cleartext),
(unsignedchar*)cleartext,buff,rsa,padding);

L'iPad du système 6.1 est une version 3G En raison du signal instable du réseau 3G (China Unicom 3gnet) utilisé, la clé publique rsa ne peut pas être obtenue fréquemment, donc la clé publique rsa ne peut pas être obtenue fréquemment. Le paramètre rsa apparaît nul. L'iPad du système 6.0 est une version wifi et le signal est stable, il n'y a donc pas de problème de ce type. La solution est de vérifier la validité des paramètres rsa.
82. Attention : UITextAlignmentCenterisdeprecatediniOS6
NSTextAlignmentCenter a été remplacé par UITextAlignmentCenter. Il existe des alternatives similaires. Vous pouvez utiliser les macros suivantes :

#ifdef__IPHONE_6_0//iOS6andlater
#defineUITextAlignmentCenter(UITextAlignment)NSTextAlignmentCenter
#defineUITextAlignmentLeft(UITextAlignment)NSTextAlignmentLeft
#defineUITextAlignmentRight(UITextAlignment)NSTextAlignmentRight
#defineUILineBreakModeTailTruncation(UILineBreakMode)NSLineBreakByTruncatingTail
#defineUILineBreakModeMiddleTruncation(UILineBreakMode)NSLineBreakByTruncatingMiddle
#endif

83. -fno-objc-arc ne peut pas être défini dans Xcode5
Xcode5 utilise ARC par défaut et masque CompileSources ". CompilerFlags", vous ne pouvez donc pas définir l'option -fno-objc-arc du fichier .m. Pour afficher la colonne CompilerFlags du fichier .m, vous pouvez utiliser le menu "Affichage->Utilitaires->MasquerUtilitaires" pour fermer temporairement la fenêtre Utilitaires de droite pour afficher la colonne CompilerFlags, afin de pouvoir définir le -fno - du fichier .m flag objc-arc.
84. Attention : 'ABAddressBookCreate' est obsolète : firstdeprecatediniOS6.0
Cette méthode est abandonnée après iOS6.0 et remplacée par la méthode ABAddressBookCreateWithOptions :

CFErrorRef*error=nil;
ABAddressBookRefaddressBook=ABAddressBookCreateWithOptions(NULL,error);

Après iOS6. 0 Comment lire le carnet d'adresses d'un téléphone portable ?
Après iOS6, le cadre AddressBook a changé, notamment que l'application doit obtenir l'autorisation de l'utilisateur pour accéder au carnet d'adresses mobile. Par conséquent, en plus d'utiliser la nouvelle méthode d'initialisation ABAddressBookCreateWithOptions, nous devons également utiliser la nouvelle méthode ABAddressBookRequestAccessWithCompletion du framework AddressBook pour savoir si l'utilisateur est autorisé :

+(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&#39;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
}

Cette méthode comporte deux blocs Les paramètres Succès et échec sont respectivement utilisés pour réaliser deux situations d'accès autorisé de l'utilisateur : consentement et désaccord.
Lorsque le code appelle la fonction ABAddressBookRequestAccessWithCompletion, le deuxième paramètre est un bloc et le paramètre accordé du bloc est utilisé pour informer l'utilisateur s'il doit accepter. Si l'accord est Non (pas d'accord), nous appelons le bloc d'échec. Si l’accord est Oui (d’accord), nous appellerons la fonction readAddressBookContacts pour lire davantage les informations de contact.
readAddressBookContacts est déclaré comme suit :

staticvoidreadAddressBookContacts(ABAddressBookRefaddressBook,void(^completion)(NSArray*contacts)){
//dostuffwithaddressBook
NSArray*contacts=(NSArray*)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
completion(contacts);
}

Récupérez d'abord tous les contacts du carnet d'adresses (les résultats sont placés dans un tableau NSArray), puis appelez le bloc d'achèvement (c'est-à-dire le bloc de réussite de la méthode fetchContacts). À la fin, nous pouvons parcourir le tableau.
Un exemple d'appel de la méthode 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)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn