Heim > Artikel > Backend-Entwicklung > Fragen zur iOS-Entwicklung (9)
101. Kompilierungsfehler: ld: Bibliothek für -lPods nicht gefunden
Dieser Fehler tritt häufig auf, wenn CocoaPods im Projekt verwendet wird (normalerweise während der Veröffentlichung).
Das liegt daran, dass CocoaPods nach der Pod-Installation einen neuen Arbeitsbereich erstellt. Sie müssen das Projekt schließen und erneut öffnen. Das Problem ist gelöst.
102. Warum ist die iOS-Zeit immer 8 Stunden langsamer als die Echtzeit?
Zum Beispiel muss eine Pekinger Zeit „2014-4-4 22:00“ (Zeichenfolge) in NSDate umgewandelt werden. Die Konvertierung von Zeichenfolgen in NSDate erfolgt im Allgemeinen über NSDateFormatter. Unter iOS wird NSDate in GMT-Zeit gespeichert, sodass NSDateFormatter automatisch die Ortszeit der aktuellen Zeitzone der Zeichenfolge verarbeitet, d. h. die konvertierte Peking-Zeit (Zeichenfolge „2014-4-4 22:00“) in GMT umwandelt Uhrzeit („2014-4-4 14:00“). Wenn Sie dieses NSDate (longlong, die Anzahl der Sekunden oder Millisekunden seit 1970) direkt an den Server übergeben, verwendet der Server diese Zeit als Peking-Zeit (tatsächlich ist es GMT-Zeit), was zu einem Zeitunterschied von 8 Stunden führt.
Der richtige Ansatz besteht darin, den Zeitunterschied basierend auf diesem NSDate hinzuzufügen. Für die Berechnung des Zeitunterschieds ist die Kenntnis der aktuellen Zeitzone erforderlich. [NSTimeZonesystemTimeZone] kann die aktuelle Zeitzone (East 8 Zone) abrufen und dann die Methode secondsFromGMTForDate: verwenden, um den Zeitunterschied (in Sekunden) dieser Zeitzone (East 8 Zone) abzurufen. Der Code lautet wie folgt:
NSDateFormatter* df=[NSDateFormatter new]; // [dfsetLocale:[NSLocale currentLocale]]; df.dateFormat=@"yyyy-MM-dd HH:mm"; NSDate* date=[dfdateFromString:@"2014-4-4 22:00"]; NSTimeZone *zone =[NSTimeZone systemTimeZone]; NSInteger interval = [zonesecondsFromGMTForDate: date]; NSDate *localeDate =[date dateByAddingTimeInterval:interval]; NSLog(@"%@",localeDate);
103. Deaktivieren Sie die Tastatur-Popup-Animation in UITableViewController.
TableViewController verfügt über einen integrierten Code für die Tastatur-Popup-Animation Zelle öffnet die Softtastatur, die Tabellenansicht scrollt automatisch nach oben. Diese Funktion verursacht jedoch manchmal große Probleme, da das Eingabesteuerelement manchmal an eine unsichtbare Stelle gescrollt wird. Da wir den Framework-Code nicht ändern können, müssen wir in diesem Fall auf die Verwendung von TableViewController (Unterklassen) verzichten und stattdessen den allgemeinen UIViewController+UITableView verwenden. Aber manchmal müssen wir TableViewContrller verwenden – wenn wir beispielsweise seine statischen Zellen verwenden möchten, können wir das Problem mit den folgenden Methoden lösen. Überschreiben Sie die viewWillAppear-Methode in der UITableViewController-Unterklasse, um das viewWillAppear-Verhalten der übergeordneten Klasse zu deaktivieren. Rufen Sie also nicht [superviewWillAppear:animated] auf:
-(void)viewWillAppear:(BOOL)animated{ // Override super method with don'tcall [super viewWillApper] }
104. Wann sollten Sie NSCache verwenden?
NSCache gibt automatisch eines der Cache-Objekte entsprechend der Speicherauslastung frei (z Beispiel: Die Ansicht ist zerstört oder es sind zu viele zwischengespeicherte Objekte vorhanden. Daher müssen die von NSCache zwischengespeicherten Objekte wie diese Objekte wiederhergestellt werden können – Daten, die bei Bedarf aus dem Netzwerk heruntergeladen werden können. Andernfalls sollten Sie NSCache nicht verwenden – das Objekt wird irgendwann zerstört.
Daher müssen Sie bei der Verwendung von NSCache darauf achten, dass das abgerufene Objekt nicht im Cache vorhanden ist:
-(CachedObject)getCachedObject:(id)key{ id* obj=[NSCacheObjectobjectForKey:key]; if (cb==nil) { obj=[[CachedObjectalloc]init]; // Recreate cached object …… } return obj; }
105. Pods-Archivproblem auf Xcode5
Problembeschreibung: Der folgende Fehler tritt beim
Archivieren auf (dies kann beim Debuggen normal sein):
ld: Bibliothek für -lPods nicht gefunden
Das Problem liegt daran, dass Xcode5.x jetzt die Architektur von Abhängigen erkennt Projekte und ihre Einstellungen müssen mit dem Hauptprojekt übereinstimmen, andernfalls wird das abhängige Projekt abgelehnt (d. h. es wird nicht kompiliert).
Lösung:
Stellen Sie unter allen Zielen des Pods-Projekts deren Architektur so ein, dass sie mit dem Hauptprojekt übereinstimmt.
106. So überprüfen Sie die von einer statischen Bibliothek unterstützte Architektur
Verwenden Sie den Befehl „lipo -info statische Bibliotheksdatei“, zum Beispiel:
lipo -info Unrar4iOS
Dann wird das Terminal wie folgt angezeigt :
Architekturen in der FAT-Datei: Unrar4iOS sind: armv7 armv6 i386
107. Die Einführung bestimmter statischer Bibliotheken in das Projekt führt zu dem Fehler „Undefinierte Symbole für Architektur armv7s/arm64“ im Archiv
As in Frage 105 erwähnt. Neben der Lösung in Frage 105 gibt es noch einen weiteren Workaround.
Überprüfen Sie zunächst die Architektur der statischen Bibliothek (siehe Frage 106). Ändern Sie dann das Schema, um die Architektur der statischen Bibliothek zu unterstützen. Ändern Sie dann „Build Active ArchitectureOnly“ in den Buid-Einstellungen (kompilieren Sie nur für die ausgewählte Architektur) und ändern Sie den Wert auf „Ja“. Dann kompilieren Sie es.
108. Unter Autolayout ist die Höhe von UITableView falsch.
Wenn unter Autolayout eine Navigationsleiste vorhanden ist, wird die UITableView in der Ansicht durch Einschränkungen eingeschränkt und die Laufzeithöhe wird durch Einschränkungen auf die Höhe ohne Navigation zurückgesetzt Bar. Zu diesem Zeitpunkt sollte die Methode viewDidLayoutSubviews implementiert werden, um den Einfluss von Einschränkungen zu beseitigen:
- (void)viewDidLayoutSubviews { _table.frame=CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height); }
109 Wie ändere ich den Titel der Standard-Zurück-Schaltfläche?
Angenommen, die Navigation lautet: A-Ansicht --> B-Ansicht
Wenn Sie den Titel der Zurück-Schaltfläche von Ansicht B ändern möchten, um zu Ansicht A zurückzukehren, verwenden Sie einfach den folgenden Code in Ansicht A:
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil]; B视图不用做任何操作。
110. Es gibt ein leeres Objekt, aber es ist weder Null noch Null?
Es ist NSNull. Sie können dieses Objekt drucken (mit dem Befehl po oder NSLog), und das gedruckte Ergebnis ist „3974e2f309543466c662a718e86a1c17“ anstelle von „(null)“ (Null-Objekt).
Da O-C-Sammlungsobjekte das Einfügen von Nullwerten (Null) nicht zulassen und NSNull nicht Null ist, wird das NSNull-Objekt verwendet, um anzuzeigen, dass die Sammlung leer ist (was das Ende der Liste anzeigt). Außerdem führt das Senden einer Nachricht an einen NSNull im Gegensatz zu Null zu einer Ausnahme.
NSNull hat die einzige Methode: [NSNull null] Sie können damit testen, ob ein Objekt NSNull ist:
BOOL isNSNull(id any){ return [any isEqual:[NSNullnull]]; }
以上就是iOS 开发百问(9)的内容,更多相关内容请关注PHP中文网(www.php.cn)!