Xcode 6.1 titleTextAttributes

поэтому я пишу это приложение с красочными навигационными панелями и шрифтом заголовка в этих барах, а шрифт UIBarButtonItems должен быть белым и определенным шрифтом. Я использовал эти 2 строки, чтобы выполнить это в AppDelegate..

    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : UIFont(name: "SourceSansPro-Regular", size: 22), NSForegroundColorAttributeName : UIColor.whiteColor()]
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName : UIFont(name: "SourceSansPro-Regular", size: 22), NSForegroundColorAttributeName : UIColor.whiteColor()], forState: .Normal)

Но с Xcode 6.1 я получаю ошибку в каждой из этих строк, и я действительно не знаю, что значит..

enter image description here

Атрибутами текста являются [NSObject: AnyObject]?. Это именно то, что я записал. У кого-нибудь есть решение для этого?

Ответ 1

Я думаю, проблема в том, что они изменили инициализатор UIFont в 6.1, чтобы он мог вернуться nil. Это правильное поведение, потому что, если вы вводите неправильное имя шрифта, невозможно создать экземпляр UIFont. В этом случае ваш словарь становится [NSObject: AnyObject?], который не совпадает с [NSObject: AnyObject]. Вы можете сначала инициализировать шрифты, а затем использовать синтаксис if let. Вот как это сделать

let font = UIFont(name: "SourceSansPro-Regular", size: 22)
if let font = font {
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : font, NSForegroundColorAttributeName : UIColor.whiteColor()]
}

Или, если вы уверены, что объект шрифта не будет nil, вы можете использовать неявно разворачиваемый необязательный синтаксис. В этом случае вы рискуете столкнуться во время выполнения. Вот как это сделать.

UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : UIFont(name: "SourceSansPro-Regular", size: 22)!, NSForegroundColorAttributeName : UIColor.whiteColor()]