我目前正在开发一个通知列表屏幕,将显示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枚举的不同而具有不同的属性?
先谢谢你。
1条答案
按热度按时间plupiseo1#
我意识到这更像是一个后端问题。如果你想为你的通知(来自后端)设置样式,你需要让你的同事在这些字符串中添加markdown。基本上,您将使用Markdown接收一个字符串,然后使用
AttributedString(markdown:)
来显示样式化的文本。我能给予你的唯一建议是跳过HTML,因为web视图是滞后的。坚持Markdown