Heim  >  Artikel  >  Backend-Entwicklung  >  Fragen zur iOS-Entwicklung (7)

Fragen zur iOS-Entwicklung (7)

黄舟
黄舟Original
2017-01-20 09:41:151503Durchsuche

71. Wie passt man die Größe von UIWebView an den HTML-Inhalt an?
In iOS5 ist dies sehr einfach: Legen Sie den Delegaten der Webansicht fest und implementieren Sie dann die Methode didFinishLoad: im Delegaten:

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

72 Es gibt mehrere Responder im Fenster, wie um die Tastatur schnell loszulassen
[[UIApplicationsharedApplication]sendAction:@selector(resignFirstResponder)to:nilfrom:nilforEvent:nil];
Auf diese Weise können alle Responder auf einmal den Fokus verlieren.
73. Wie aktiviere ich UIWebView zum Zoomen durch die „Pinch“-Geste?
Verwenden Sie den folgenden Code:

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

74, Undefinedsymbols:_kCGImageSourceShouldCache, _CGImageSourceCreateWithData, _CGImageSourceCreateImageAtIndex

ImageIO.framework wird nicht importiert.

75. erwartete Methode zum Lesen eines Wörterbuchelements, das nicht auf einem Objekt von Typen gefunden wurde

SDK6.0 hat dem Wörterbuch einen „Subscript“-Index hinzugefügt, d. h. Objekte im Wörterbuch werden über dictionary[@“key“ abgerufen. Aber in SDK5.0 ist dies illegal. Sie können im Projekt eine neue Header-Datei NSObject+subscripts.h erstellen. Der Inhalt lautet wie folgt:

#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. messagesenttodeallocatedinstance0x1efd4750
Dies ist ein Speicherverwaltungsfehler. Das MKNetwork-Framework unterstützt ARC und es sollten keine Speicherverwaltungsprobleme auftreten. Aufgrund einiger Fehler in MKNetwork tritt dieses Problem jedoch auf, wenn MKNetworkEngine nicht auf das starke Attribut eingestellt ist. Es wird empfohlen, das MKNetworkEngine-Objekt auf das starke Attribut ViewController festzulegen.

77. Der Unterschied zwischen UIImagePickerControllerSourceTypeSavedPhotosAlbum und UIImagePickerControllerSourceTypePhotoLibrary
UIImagePickerControllerSourceTypePhotoLibrary stellt die gesamte Fotobibliothek dar und ermöglicht Benutzern die Auswahl aller Fotoalben (einschließlich Kamerarollen), während UIImagePickerControllerSourceTypeSavedPhotosAlbum nur Kamerarollen enthält.
78. Warnung „Prototypetablecellsmusthaveresueidentifiers“
Das Identidfier-Attribut von Prototypecell (iOS5-Vorlagenzelle) ist nicht ausgefüllt, füllen Sie es einfach in der Attributvorlage aus.
79. Wie liest man den Wert in info.plist?
Der folgende Beispielcode liest die URLSchemes in info.plist:

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

80 Wie kann verhindert werden, dass sich ActionSheet automatisch auflöst?
UIActionSheet wird schließlich automatisch geschlossen, unabhängig davon, auf welche Schaltfläche geklickt wird. Der beste Weg besteht darin, eine Unterklasse zu erstellen, ein noAutoDismiss-Attribut hinzuzufügen und die dismissWithClickedButtonIndex-Methode zu überschreiben. Wenn dieses Attribut YES ist, wird keine Entlassungsaktion durchgeführt. Wenn es NO ist, wird die Standardeinstellung dismissWithClickedButtonIndex aufgerufen:
81. Absturz beim Ausführen der RSA_public_encrypt-Funktion

Dieses Problem ist sehr seltsam. Die Verwendung von zwei Geräten, eines mit System 6.1 und eines mit 6.02, mit demselben Code, in Version 6.02 funktioniert alles einwandfrei, führt in Version 6.1 zum Absturz des Programms:
#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



Das Problem ist dieses Satz:

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


Das 6.1-System-iPad ist eine 3G-Version. Aufgrund des instabilen Signals des verwendeten 3G-Netzwerks (China Unicom 3gnet) kann der öffentliche RSA-Schlüssel nicht häufig abgerufen werden Der RSA-Parameter scheint gleich Null zu sein. Das 6.0-System-iPad ist eine WLAN-Version und das Signal ist stabil, sodass es kein solches Problem gibt. Die Lösung besteht darin, die Gültigkeit der RSA-Parameter zu überprüfen.

82. Warnung: UITextAlignmentCenter ist veraltet iniOS6
buffSize=RSA_public_encrypt(strlen(cleartext),
(unsignedchar*)cleartext,buff,rsa,padding);
NSTextAlignmentCenter wurde durch UITextAlignmentCenter ersetzt. Es gibt einige ähnliche Alternativen:




83. -fno-objc-arc kann in Xcode5 nicht festgelegt werden

Xcode5 verwendet standardmäßig ARC und verbirgt CompileSources " CompilerFlags“-Spalte, sodass Sie die Option -fno-objc-arc der .m-Datei nicht festlegen können. Um die CompilerFlags-Spalte der .m-Datei anzuzeigen, können Sie das Menü „Ansicht->Dienstprogramme->HideUtilities“ verwenden, um das Dienstprogrammfenster auf der rechten Seite vorübergehend zu schließen, um die CompilerFlags-Spalte anzuzeigen, sodass Sie die -fno festlegen können - der .m-Datei.
#ifdef__IPHONE_6_0//iOS6andlater
#defineUITextAlignmentCenter(UITextAlignment)NSTextAlignmentCenter
#defineUITextAlignmentLeft(UITextAlignment)NSTextAlignmentLeft
#defineUITextAlignmentRight(UITextAlignment)NSTextAlignmentRight
#defineUILineBreakModeTailTruncation(UILineBreakMode)NSLineBreakByTruncatingTail
#defineUILineBreakModeMiddleTruncation(UILineBreakMode)NSLineBreakByTruncatingMiddle
#endif
84. Warnung: „ABAddressBookCreate“ ist veraltet: firstdeprecatediniOS6.0

Diese Methode wird nach iOS6.0 aufgegeben und durch die Methode ABAddressBookCreateWithOptions ersetzt:



85. 0 Wie lese ich das Adressbuch eines Mobiltelefons?

Nach iOS6 hat sich das Adressbuch-Framework geändert, insbesondere dass die App eine Benutzerberechtigung einholen muss, um auf das mobile Adressbuch zuzugreifen. Daher müssen wir zusätzlich zur Verwendung der neuen Initialisierungsmethode ABAddressBookCreateWithOptions auch die neue Methode ABAddressBookRequestAccessWithCompletion des AddressBook-Frameworks verwenden, um festzustellen, ob der Benutzer autorisiert ist:
CFErrorRef*error=nil;
ABAddressBookRefaddressBook=ABAddressBookCreateWithOptions(NULL,error);



Diese Methode hat zwei Blöcke Die Erfolgs- und Misserfolgsparameter werden jeweils verwendet, um zwei Situationen des benutzerautorisierten Zugriffs durchzuführen: Zustimmung und Ablehnung.

Wenn der Code die Funktion ABAddressBookRequestAccessWithCompletion aufruft, ist der zweite Parameter ein Block, und der gewährte Parameter des Blocks wird verwendet, um den Benutzer darüber zu informieren, ob er zustimmt. Wenn gewährt „Nein“ (nicht einverstanden) ist, rufen wir den Fehlerblock auf. Wenn „gewährt“ „Ja (zustimmen)“ lautet, rufen wir die Funktion „readAddressBookContacts“ auf, um die Kontaktinformationen weiter zu lesen.
+(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
}
readAddressBookContacts wird wie folgt deklariert:




Zuerst alle Kontakte aus dem Adressbuch abrufen (die Ergebnisse werden in ein NSArray-Array eingefügt) und dann den Abschlussblock aufrufen (d. h Erfolgsblock der fetchContacts-Methode). Abschließend können wir über das Array iterieren.

Ein Beispiel für den Aufruf der fetchContacts-Methode:
staticvoidreadAddressBookContacts(ABAddressBookRefaddressBook,void(^completion)(NSArray*contacts)){
//dostuffwithaddressBook
NSArray*contacts=(NSArray*)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
completion(contacts);
}

+(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)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Fragen zur iOS-Entwicklung (6)Nächster Artikel:Fragen zur iOS-Entwicklung (6)