Подтвердить что ты не робот

Добавьте NSUnderlineStyle.PatternDash в NSAttributedString в Swift?

Я пытаюсь добавить подчеркивание к некоторому тексту в моем приложении Swift. Это код, который у меня есть:

let text = NSMutableAttributedString(string: self.currentHome.name)

let attrs = [NSUnderlineStyleAttributeName:NSUnderlineStyle.PatternDash]

text.addAttributes(attrs, range: NSMakeRange(0, text.length))
homeLabel.attributedText = text

Но я получаю эту ошибку в строке text.addAttributes:

NSString не идентичен NSObject

Как добавить атрибут, содержащийся в перечислении, в NSMutableAttributedString в Swift?

4b9b3361

Ответ 1

Вот полный пример создания UILabel с подчеркнутым текстом:

Свифт 5:

let homeLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 30))

let text = NSMutableAttributedString(string: "hello, world!")

let attrs = [NSAttributedString.Key.underlineStyle: NSUnderlineStyle.patternDash.rawValue | NSUnderlineStyle.single.rawValue]

text.addAttributes(attrs, range: NSRange(location: 0, length: text.length))

homeLabel.attributedText = text

Свифт 4:

let homeLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 30))

let text = NSMutableAttributedString(string: "hello, world!")

let attrs = [NSAttributedStringKey.underlineStyle: NSUnderlineStyle.patternDash.rawValue | NSUnderlineStyle.styleSingle.rawValue]

text.addAttributes(attrs, range: NSRange(location: 0, length: text.length))

homeLabel.attributedText = text

Свифт 2:

Swift позволяет вам передавать Int в метод, который принимает NSNumber, так что вы можете сделать это немного чище, удалив преобразование в NSNumber:

text.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleDouble.rawValue, range: NSMakeRange(0, text.length))

Примечание. Этот ответ ранее использовал toRaw() как и в первоначальном вопросе, но теперь он неверен, поскольку toRaw() был заменен свойством rawValue в Xcode 6.1.

Ответ 2

Если вы хотите фактическую пунктирную линию, вы должны выбрать OR | необработанные значения как PatternDash, так и StyleSingle перечисления, как показано ниже:

let dashed     =  NSUnderlineStyle.PatternDash.rawValue | NSUnderlineStyle.StyleSingle.rawValue

let attribs    = [NSUnderlineStyleAttributeName : dashed, NSUnderlineColorAttributeName : UIColor.whiteColor()];

let attrString =  NSAttributedString(string: plainText, attributes: attribs)

Ответ 3

В Xcode 6.1 SDK iOS 8.1 toRaw() был заменен на rawValue:

 text.addAttribute(NSUnderlineStyleAttributeName, value:  NSUnderlineStyle.StyleDouble.rawValue, range: NSMakeRange(0, text.length))

Или проще:

 var text : NSAttributedString = NSMutableAttributedString(string: str, attributes : [NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue]) 

Ответ 4

Оказывается, мне нужен метод toRaw() - это работает:

text.addAttribute(NSUnderlineStyleAttributeName, value: NSNumber(integer:(NSUnderlineStyle.StyleDouble).toRaw()), range: NSMakeRange(0, text.length))