Ich versuche, eine universelle iPhone-App zu erstellen, aber sie verwendet eine Klasse, die nur in einer neueren Version des SDK definiert ist. Das Framework ist auf älteren Systemen vorhanden, eine im Framework definierte Klasse jedoch nicht.
Ich weiß, dass ich eine Art schwache Verknüpfung verwenden möchte, aber in jeder Dokumentation, die ich finden kann, finden sich Hinweise zu Laufzeitprüfungen für das Vorhandensein von Funktionen. Wie überprüfe ich, ob eine Klasse vorhanden ist?
ios
backwards-compatibility
weak-linking
Psychotik
quelle
quelle
Antworten:
TLDR
Aktuell:
if #available(iOS 9, *)
if (@available(iOS 11.0, *))
if (NSClassFromString(@"UIAlertController"))
Erbe:
if objc_getClass("UIAlertController")
if (NSClassFromString(@"UIAlertController"))
if ([UIAlertController class])
Swift 2+
Obwohl in der Vergangenheit empfohlen wurde, anstelle bestimmter Betriebssystemversionen nach Funktionen (oder Klassenexistenz) zu suchen, funktioniert dies in Swift 2.0 aufgrund der Einführung der Verfügbarkeitsprüfung nicht gut .
Verwenden Sie stattdessen diesen Weg:
Hinweis: Wenn Sie stattdessen versuchen, zu verwenden
objc_getClass()
, wird der folgende Fehler angezeigt:Frühere Versionen von Swift
Beachten Sie, dass dies
objc_getClass()
zuverlässiger ist alsNSClassFromString()
oderobjc_lookUpClass()
.Objective-C, iOS 4.2+
Weitere Informationen finden Sie in der Antwort von code007 .
OS X oder frühere Versionen von iOS
Verwenden Sie
NSClassFromString()
. Wenn es zurückgibtnil
, existiert die Klasse nicht, andernfalls wird das Klassenobjekt zurückgegeben, das verwendet werden kann.Dies ist laut Apple in diesem Dokument der empfohlene Weg :
quelle
Class
InstanzNSClassFromString
(weisen Sie sie zuid
) und rufen Sie Selektoren für diese Instanz auf.canImport
. VorschlagFür neue Projekte, die ein Basis-SDK von iOS 4.2 oder höher verwenden, gibt es diesen neuen empfohlenen Ansatz, bei dem die NSObject-Klassenmethode verwendet wird, um die Verfügbarkeit schwach verknüpfter Klassen zur Laufzeit zu überprüfen. dh
Quelle: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-SW3
Dieser Mechanismus verwendet das Makro NS_CLASS_AVAILABLE, das für die meisten Frameworks in iOS verfügbar ist (möglicherweise gibt es einige Frameworks, die NS_CLASS_AVAILABLE noch nicht unterstützen - lesen Sie hierzu den Versionshinweis für iOS). Möglicherweise ist auch eine zusätzliche Einstellungskonfiguration erforderlich, die Sie über den oben angegebenen Link zur Dokumentation von Apple lesen können. Der Vorteil dieser Methode besteht jedoch darin, dass Sie eine statische Typprüfung erhalten.
quelle
UIAlertController
gestoßen , als ich versucht habe, Code zu erstellen, der enthalten ist, während iOS 7 weiterhin unterstützt wird. Die Antwort von code007 ist korrekt, aber die zusätzliche Konfiguration besteht darinRequired
,Optional
UIKit in Ihrem Projekt schwach zu verknüpfen (von bis zu setzen ) (zumindest für diese Situation).