【发布时间】:2021-02-26 17:17:55
【问题描述】:
我的应用最近进行了本地化,现在我遇到了 NSSortDescriptor 和 Core Data 的问题。
基本上,我有一个获取请求,它对具有预定义英语属性的对象使用 NSSortDescriptor,现在我需要使用翻译版本进行排序。
当使用基本语言(英语)时,这有效:
func initTodayGrouped(delegate: NSFetchedResultsControllerDelegate) -> NSFetchedResultsController<Category> {
let request: NSFetchRequest<Category> = Category.fetchRequest()
request.predicate = NSPredicate(format: "active == %d", true)
let sort = NSSortDescriptor(key: #keyPath(Category.title), ascending: true, selector: #selector(NSString.localizedCompare(_:)))
let sectionSort = NSSortDescriptor(key: #keyPath(Category.typeSection), ascending: true, selector: #selector(NSString.localizedCompare(_:)))
request.sortDescriptors = [sectionSort, sort]
let controller = NSFetchedResultsController(fetchRequest: request,
managedObjectContext: managedContext,
sectionNameKeyPath: #keyPath(Category.typeSection),
cacheName: nil)
controller.delegate = delegate
return controller
}
Category 是我的核心数据实体,Category.typeSection 是一个字符串,是用于对部分进行排序的属性。
extension Category {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Category> {
return NSFetchRequest<Category>(entityName: "Category")
}
@NSManaged public var active: Bool
@NSManaged public var color: String?
@NSManaged public var icon: String?
@NSManaged public var id: UUID?
@NSManaged public var index: Int16
@NSManaged public var subtitle: String?
@NSManaged public var title: String?
@NSManaged public var typeSection: String? // <-- HERE
@NSManaged public var events: NSSet?
}
现在我需要使用这个属性的本地化版本。
我想用一个替换/覆盖 NSString.localizedCompare(_:) 的方法制作一个 NSString 扩展,该方法将使用 NSLocalizedString 而不是字符串本身,但我认为我无法将它暴露给 Objective-C 运行时(我得到“不支持的排序描述符”)。然后我想可能会在实体扩展中添加一个计算属性,这将返回 NSLocalizedString,如 Category.translatedTypeSection 但我得到“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'keypath translateTypeSection not found in entity Category'”) .
最后,我认为this answer by Rob Napier 会起作用,因为 OP 有一个非常相似的问题,但我无法将其翻译成 Swift。
TL;DR
我的核心数据实体有一个typeSection 属性,这是一个预定义(非用户输入)英文字符串,用于对部分进行排序。
既然应用程序已本地化为其他语言,我需要对该属性的翻译版本而不是数据库中记录的基本语言版本进行排序。
【问题讨论】:
标签: swift core-data nsfetchedresultscontroller nssortdescriptor nslocalizedstring