Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何按';创建UITableViewCell时计算的值?_Swift_Sorting_Core Data_Nsfetchedresultscontroller - Fatal编程技术网

Swift 如何按';创建UITableViewCell时计算的值?

Swift 如何按';创建UITableViewCell时计算的值?,swift,sorting,core-data,nsfetchedresultscontroller,Swift,Sorting,Core Data,Nsfetchedresultscontroller,我的应用程序中有一个UITableView,其中显示了NSFetchedResultsController中类型为lifteEvent的一长串nsmanagedObject。但是,显示的其中一个值不是存储属性,它是在创建UITableViewCell的视图模型时(在扩展名中)通过调用对象上的方法计算的: 我做了我的家庭作业,发现两年前的一个和四年多前的另一个说当使用nsfecturesultsController时无法完成,但Swift变化如此之快,我想知道现在是否可能。我已经阅读了苹果的文档,

我的应用程序中有一个
UITableView
,其中显示了
NSFetchedResultsController
中类型为
lifteEvent
的一长串
nsmanagedObject
。但是,显示的其中一个值不是存储属性,它是在创建
UITableViewCell
的视图模型时(在
扩展名中)通过调用对象上的方法计算的:

我做了我的家庭作业,发现两年前的一个和四年多前的另一个说当使用
nsfecturesultsController
时无法完成,但Swift变化如此之快,我想知道现在是否可能。我已经阅读了苹果的文档,我看不到一种方法来实现它,但我对这个API非常陌生


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

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

  • 按具有相同顺序的不同属性排序。例如,您可以按
    日期
    排序,然后按
    日期
    显示,即使
    日期
    不是属性,而是从
    日期
    派生的属性。您甚至可以将
    day
    用作
    sectionNameKeyPath
  • 将该值存储为常规属性。如果它是从其他属性派生的,则必须在更新其他属性时更新它
  • 在执行提取后执行内存中排序

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

    谢谢你,乔恩。具有讽刺意味的是,我最近对代码进行了重构,不再将值存储为常规属性,因为用户可以在磅和公斤之间转换结果数字,这可能会引入舍入错误。
    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)"
    
        }
    }