我在我的应用程序中有一个UITableView
,它显示NSFetchedResultsController
中LiftEvent
类型的NSManagedObjects
的长列表。其中显示,但是,是不是一个存储的属性,它的计算值,通过调用对象的方法正在创建的UITableViewCell
视图模型时(在extension
)的:如何通过在创建UITableViewCell时计算的值对UITableView进行排序?
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
或我必须放弃并使用一个简单的数组?
谢谢,乔恩。具有讽刺意味的是,我重构了我的代码以最终停止将该值存储为常规属性,因为结果数字可以由用户在磅和千克之间转换,并且可能会引入舍入错误。 – Jim