2017-05-28 26 views
0

我在我的应用程序中有一个UITableView,它显示NSFetchedResultsControllerLiftEvent类型的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或我必须放弃并使用一个简单的数组?

回答

0

有没有什么不可思议的快速,这将允许您创建一个fetchedResultsController按未存储在核心数据中的属性排序。有三种可能的解决方案:

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

1是最好的解决方案,但我不明白你的模型知道它是否可能。如果这是不可能的,我会推荐2.一般来说,从一个地方更新你的模型是一个好习惯,所以添加一个代码来同步你的派生属性不应该那么繁琐。

+0

谢谢,乔恩。具有讽刺意味的是,我重构了我的代码以最终停止将该值存储为常规属性,因为结果数字可以由用户在磅和千克之间转换,并且可能会引入舍入错误。 – Jim

相关问题