Odpowiedź od @ Abrax5 jest doskonała. Właśnie chciałem dodać moje doświadczenie z tym problemem i nie mógł zmieścić tego w komentarzu:
O ile mogę powiedzieć, ten błąd jest zgłaszany tylko przy pierwszej nieudanej próbie zainicjowania NSFont
z nazwą czcionki, która jest niedostępne. NSFont
Inicjatory są niepoprawne i zwrócą się w takim przypadku na numer nil
, kiedy będzie można coś z tym zrobić.
Można sprawdzić, czy czcionka o podanej nazwie jest dostępna przy użyciu:
NSFontDescriptor(fontAttributes: [NSFontNameAttribute: "<font name>"]).matchingFontDescriptorWithMandatoryKeys([NSFontNameAttribute]) != nil
Niestety, ten podnosi także błąd! Poniższa metoda nie działa, ale jest nieaktualny:
let fontDescr = NSFontDescriptor(fontAttributes: [NSFontNameAttribute: "<font name>"])
let isAvailable = NSFontManager.sharedFontManager().availableFontNamesMatchingFontDescriptor(fontDescr)?.count ?? 0 > 0
Więc jedynym sposobem znalazłem sprawdzenia dostępności czcionką o podanej nazwie nie podnosząc tego błędu jest następująca:
public extension NSFont {
private static let availableFonts = (NSFontManager.sharedFontManager().availableFonts as? [String]).map { Set($0) }
public class func available(fontName: String) -> Bool {
return NSFont.availableFonts?.contains(fontName) ?? false
}
}
Dla Przykład:
NSFont.available("Georgia") //--> true
NSFont.available("WTF?") //--> false
(Jestem chyba zbyt ostrożny z tym opcjonalnym tam stała i jeśli są tak skłonne można przekonwertować zwrócony [AnyObject]
użyciu as! [String]
...)
Należy pamiętać, że ze względu na wydajność nie zostanie ona zaktualizowana, dopóki aplikacja nie zostanie uruchomiona ponownie, tj. Wszelkie czcionki zainstalowane podczas uruchamiania aplikacji nie zostaną dopasowane. Jeśli jest to ważny problem dla danej aplikacji, wystarczy włączyć stałe do nieruchomości komputerowej:
public extension NSFont {
private static var allAvailable: Set<String>? {
return (NSFontManager.sharedFontManager().availableFonts as? [String]).map { Set($0) }
}
private static let allAvailableAtStart = allAvailable
public class func available(fontName: String) -> Bool {
return NSFont.allAvailable?.contains(fontName) ?? false
}
public class func availableAtStart(fontName: String) -> Bool {
return NSFont.allAvailableAtStart?.contains(fontName) ?? false
}
}
Na moim komputerze available(:)
trwa 0.006s
. Oczywiście, availableAtStart(:)
praktycznie nie ma czasu na wszystkie, oprócz pierwszego połączenia ...
Hmm .. Próbowałem tego, ale nie zadziałało. Btw, problem nadal pozostaje ...: S –