gpt4 book ai didi

swift - 如何按创建 UITableViewCell 时计算的值对 UITableView 进行排序?

转载 作者:行者123 更新时间:2023-11-30 12:25:49 25 4
gpt4 key购买 nike

我有一个UITableView在我的应用程序中显示了一个长列表 NSManagedObjects类型 LiftEvent位于 NSFetchedResultsController 中。然而,显示的值之一不是存储的属性,它是通过在 View 模型为 UITableViewCell 时调用对象上的方法来计算的。正在创建(在 extension 中):

class LiftLogTableViewCell: UITableViewCell {

@IBOutlet weak var liftName: UILabel!
@IBOutlet weak var liftDetails: UILabel!
@IBOutlet weak var liftDate: UILabel!
@IBOutlet weak var oneRepMaxWeight: UILabel!
@IBOutlet weak var unit: UILabel!
@IBOutlet weak var formula: UILabel!

var liftWeight: String!
var repetitions: String!

struct ViewData {
let liftName: String
let liftWeight: Double
let repetitions: Int
let liftDate: String
let oneRepMaxWeight: Double
let unit: String
let formula: String
}

var viewData: ViewData! {
didSet {
liftName!.text = viewData.liftName
liftWeight = String(viewData.liftWeight)
repetitions = String(viewData.repetitions)

let formatter = StringFormatter()
let formattedWeightLifted = formatter.formatForDisplay(viewData.liftWeight)
liftDetails!.text = "\(formattedWeightLifted) @ \(viewData.repetitions)"
liftDate!.text = "on \(viewData.liftDate)"
oneRepMaxWeight!.text = "\(viewData.oneRepMaxWeight)"
unit!.text = viewData.unit
formula!.text = viewData.formula
}
}
}

extension LiftLogTableViewCell.ViewData {
init(liftEvent: LiftEvent) {
self.liftName = liftEvent.lift.liftName

// liftEvent.calculatOneRepMax() uses two stored properties of the LiftEvent to calculate the value
let oneRepMax = liftEvent.calculateOneRepMax()

if liftEvent.liftWeight.unit.symbol == UserDefaults.weightUnit() {
self.liftWeight = liftEvent.liftWeight.value
self.oneRepMaxWeight = oneRepMax.value
self.unit = oneRepMax.unit.symbol
} else {
let convertedLiftWeight = ConvertWeightService().convertToOtherUnit(weight: liftEvent.liftWeight)
self.liftWeight = convertedLiftWeight.value
let convertedMaxWeight = ConvertWeightService().convertToOtherUnit(weight: oneRepMax)
self.oneRepMaxWeight = convertedMaxWeight.value
self.unit = convertedMaxWeight.unit.symbol
}

self.repetitions = Int(liftEvent.repetitions)
self.formula = liftEvent.formula.formulaName
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let formattedDate = dateFormatter.string(from: liftEvent.date as Date)
self.liftDate = "\(formattedDate)"

}
}

我已经完成了我的作业,发现了一个 thread两年前和另一次thread四年前,有人说使用 NSFecthedResultsController 时无法完成此操作,但 Swift 变化如此之快,我想知道现在是否可能。我已阅读 Apple 的文档,但找不到实现此目的的方法,但我对这个 API 还很陌生。

有没有办法用NSFetchedResultsController来做到这一点或者我必须放弃它并使用一个简单的数组?

最佳答案

Swift 并没有什么神奇之处,它允许您创建一个按未存储在核心数据中的属性排序的 fetchedResultsController。共有三种可能的解决方案:

  1. 按具有相同顺序的不同属性排序。例如,您可以按 date 排序,然后按 day 显示,即使 day 不是属性,而是从 date 派生的属性。您甚至可以使用 day 作为 sectionNameKeyPath
  2. 将该值存储为常规属性。如果它是从其他属性派生的,那么每当其他属性更新时您都必须更新它。
  3. 执行提取操作后进行内存中排序。

1是最好的解决方案,但我不了解你的模型,不知道它是否可能。如果不可能,我会建议 2。一般来说,仅从一个位置更新模型是一种很好的做法,因此添加代码来同步派生属性应该不会那么繁重。

关于swift - 如何按创建 UITableViewCell 时计算的值对 UITableView 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44228558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com