在Swift中基于单元格类型创建属性字符串

fhg3lkii  于 2023-06-28  发布在  Swift
关注(0)|答案(1)|浏览(84)

我目前正在开发一个通知列表屏幕,将显示4种类型的通知。下面是它看起来像一个非常简单的方式:

对我来说,主要的问题是根据单元格类型正确地赋予文本属性。我的通知单元格有这样的设置代码:

enum NotificationType {
    case eventDue(UIImage)
    case eventCreated(UIImage)
    case eventChanged(UIImage)
    case inviteDeclined(UIImage)
    case adminMessage(UIImage)
    case invite(UIImage)
    
    var image: UIImage? {
        switch self {
        case .eventDue(let image), .eventChanged(let image), .inviteDeclined(let image), .eventCreated(let image):
            return image
        case .invite(let avatarImage), .adminMessage(let avatarImage):
            return avatarImage
        }
    }

在我的viewModel中,我试图使通知的标题具有属性,但我在选择字符串的适当部分并使其为黑色时遇到了问题。我的视图模型代码:

final class NotificationViewModel: ObservableObject {
   let type: NotificationType
   var isUnread: Bool
   let title: String
   let date: Date
   
   init(type: NotificationType,
        isUnread: Bool,
        title: String,
        date: Date) {
       self.type = type
       self.isUnread = isUnread
       self.title = title
       self.date = date
   }
}

extension NotificationViewModel {
   var formattedTitle: AttributedString {
       var result = AttributedString(title)
       result.font = Fonts.body
       result.foregroundColor = UIColor(displayP3Red: 0.68, green: 0.68, blue: 0.68, alpha: 1.0)
       
       let words = title.split(separator: " ")
       
       switch type {
       case .eventDue(_):
        // make time before event (either 60 or 30) and event name black
       case .eventCreated(_):
        // make name of person and event name black
       case .eventChanged(_):
       // make name of person and event name black
       case .inviteDeclined(_):
       // make name black
       case .message(_):
       // Make all text black
       case .invite(_):
           let nameSurname = words[0...1].joined(separator: " ") // here is what I was trying but realized it wouldn't work properly...
       }
   }
}

我决定使用AttributedString,默认情况下我将整个字符串设置为灰色,我认为我可以在每种情况下将每个通知类型的重要部分设置为粗体。基本上,如果它是一个邀请通知-使名称(始终作为姓名)的黑色和离开其余的灰色等...我不认为使用范围会正常工作,它似乎不是很灵活。* * 此外,它必须与不同的语言一起工作,例如在德语中,单词的顺序可能会改变,因为它们的语法...**我如何才能完成这种任务?也许我可以让ViewModel中的标题成为一个结构体,根据NotificaitonType枚举的不同而具有不同的属性?
先谢谢你。

plupiseo

plupiseo1#

我意识到这更像是一个后端问题。如果你想为你的通知(来自后端)设置样式,你需要让你的同事在这些字符串中添加markdown。基本上,您将使用Markdown接收一个字符串,然后使用AttributedString(markdown:)来显示样式化的文本。我能给予你的唯一建议是跳过HTML,因为web视图是滞后的。坚持Markdown

相关问题