Heim >Backend-Entwicklung >PHP-Tutorial >Fragen zur iOS-Entwicklung (7)
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
#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.
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
#ifdef__IPHONE_6_0//iOS6andlater #defineUITextAlignmentCenter(UITextAlignment)NSTextAlignmentCenter #defineUITextAlignmentLeft(UITextAlignment)NSTextAlignmentLeft #defineUITextAlignmentRight(UITextAlignment)NSTextAlignmentRight #defineUILineBreakModeTailTruncation(UILineBreakMode)NSLineBreakByTruncatingTail #defineUILineBreakModeMiddleTruncation(UILineBreakMode)NSLineBreakByTruncatingMiddle #endif84. 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?
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.
+(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 }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.
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)!