Сбой NSMutableAttributedString с пользовательским шрифтом

Это странно.

Это работает:

titleLabel.font = UIFont(name: "OpenSans-Regular", size: 14)

Это работает:

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans-Bold", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Forgot your password? Reset it here")))

Это не так. Дает сбой:

Неожиданно найдено nil при развертывании необязательного значения

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans-Regular", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect."))). 

Первый пример показывает, что OpenSans-Regular отлично работает в приложении. (Тот же шрифт, что и в третьем примере).

Второй пример показывает, что строка с атрибутами отлично работает с пользовательским шрифтом.

Третий пример показывает, что атрибутированная строка с пользовательским шрифтом не работает.

Я дважды проверил, OpenSans-Regular я правильно скопировал в свой проект:

Каталог проекта:

введите здесь описание изображения.

Копировать ресурсы пакета:

введите здесь описание изображения

Информация.plist:

введите здесь описание изображения.


person Nitish    schedule 23.01.2018    source источник
comment
это UIFont(name: "OpenSans-Bold", size: 18), вероятно, nil из-за того, что имя пользовательского шрифта неверно, или пользовательский шрифт не поддерживается приложением.   -  person holex    schedule 23.01.2018
comment
Убедитесь в наличии действительного шрифта, выполнив код с if-let и посмотрите, какой результат вы получите   -  person Krunal    schedule 23.01.2018
comment
К сведению: имя, которое вы передаете в качестве имени UIFont(name:size:), часто отличается от базового имени файла ttf.   -  person rmaddy    schedule 23.01.2018
comment
Каково постскриптумное название этого шрифта? Кроме того, это не NSMutableAttributedString, который вызывает сбой, это ваш шрифт, потому что вы использовали !, говоря Crash if nil, в то время как вы не установили шрифт в своей метке (что, как я ожидаю, не сработало).   -  person Larme    schedule 23.01.2018
comment
См. раздел stackoverflow.com/questions/18021945/ и stackoverflow.com/questions/18413332/   -  person rmaddy    schedule 23.01.2018
comment
прочитайте codewithchris.com/ и убедитесь, что вы используете правильное имя шрифта (см. пункт 5 в этой статье)   -  person Milan Nosáľ    schedule 23.01.2018
comment
@maddy: Оказывается, твои слова верны на 100%. Его следует использовать как OpenSans вместо OpenSans-Regular, как предлагает ссылка. Пожалуйста, опубликуйте свой ответ для дальнейшего использования.   -  person Nitish    schedule 23.01.2018
comment
@maddy: Однако я подозреваю, что вопрос не дублируется. Они связаны, но определенно не дублируются.   -  person Nitish    schedule 23.01.2018
comment
@Nitish Нет, в ответе говорится использовать OpenSans, потому что это постскриптумное имя шрифта (прочитайте ответ, используйте FontBook.app на своем Mac), что я тоже предложил. И это явно одно и то же решение по той же причине, по которой используется OpenSans. Тогда это дубликат.   -  person Larme    schedule 23.01.2018


Ответы (2)


Вы просто не правильно добавили шрифт с именем "OpenSans-Regular",

Первая строка, строка:

titleLabel.font = UIFont(name: "OpenSans-Regular", size: 14)

работает, потому что titleLabel.font является необязательным, поэтому у него нет проблем с UIFont(name: "OpenSans-Regular", size: 14), оцениваемым как ноль. Так что это не доказывает, что "OpenSans-Regular" было добавлено правильно.

Однако в третьем примере:

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans-Regular", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect.")))

здесь вы принудительно разворачиваете его (обратите внимание на ! в конце UIFont(name: "OpenSans-Regular", size: 18)!), поэтому он вылетает - это, с другой стороны, доказывает, что вы добавили его неправильно.

ИЗМЕНИТЬ

Убедитесь, что вы правильно добавили "OpenSans-Regular" в проект. Я рекомендую просмотреть список в этом блоге вход, особенно КПП номер 5 там (имена).

ИЗМЕНИТЬ 2

Как указал @rmaddy, "OpenSans-Regular" равно "OpenSans" - см. этот вопрос. Поэтому скорее используйте:

titleLabel.font = UIFont(name: "OpenSans", size: 14)

А также:

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect.")))
person Milan Nosáľ    schedule 23.01.2018
comment
Я дважды проверяю свой проект. Шрифт копируется корректно. Пожалуйста, проверьте мой обновленный вопрос. - person Nitish; 23.01.2018
comment
попробуйте это: titleLabel.font = UIFont(name: "OpenSans-Regular", size: 14)! - если это вылетает, есть проблема с добавлением шрифта.. - person Milan Nosáľ; 23.01.2018
comment
Оказывается, наблюдение Мэдди верно. И твое тоже. Спасибо Милан. - person Nitish; 23.01.2018
comment
@Nitish нет проблем - person Milan Nosáľ; 23.01.2018
comment
Принимаю ваш ответ, так как Мэдди не публикует его. - person Nitish; 23.01.2018

Это позволит избежать сбоя приложения. Принудительное развертывание UIFont может быть причиной сбоя приложения. Попробуйте это и посмотрите.

if let openSansRegularFont18 = UIFont(name: "OpenSans-Regular", size: 18) {
   attributedString.addAttribute(NSFontAttributeName, value:
    openSansRegularFont18,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect.")))
} else {
  print("OpenSans-Regular is nil (not installed/added in your project)")
  // Font file name differs from the actual font name.  Use font name as "OpenSans" only.
}
person Krunal    schedule 23.01.2018
comment
еще звонят. Интересно, почему так, если я правильно добавил шрифт. - person Nitish; 23.01.2018
comment
Можете ли вы поделиться файлами шрифтов (семейства) или исходными файлами шрифтов. Я могу проверить это с моим проектом - person Krunal; 23.01.2018
comment
@Nitish Вы правильно добавили шрифт, но используете неправильное имя. Смотрите ссылки, которые я только что разместил под вопросом. - person rmaddy; 23.01.2018
comment
@Nitish - Ссылка, которой поделился rmaddy, может решить вашу проблему. В нем указано удалить слово regular. Просто используйте только OpenSans. - person Krunal; 23.01.2018
comment
Оказывается, Мэдди права. Спасибо, Крунал, за ваш вклад. - person Nitish; 23.01.2018