2017-01-01 79 views
0

我试图构建一个相当复杂的表。此表格的一个单元格导入另一个表格。在这个导入的表格中,我根据情况显示不同的行。导入的表格和所有可导入的表格单元格被组织到自己的具有自己的控制器的nib文件中,用于每个单元格。作为一名优秀的程序员,我试图在整个项目中使用依赖注入。现在的问题是,当我使用viewDidLoad中()注册碎粒uitableviewcell笔尖中的依赖注入

let cellNib = UINib(nibName: "BatchConsumptionCell", bundle: nil) 
tableView.register(cellNib, forCellReuseIdentifier: "BatchConsumptionCell") 

,然后把它们作为dequeueReusableCell(withIdentifier的常用方法:在的tableView(为的tableView :):cellForRowAt :)

let batchConsumptionCell = tableView.dequeueReusableCell(withIdentifier: "BatchConsumptionCell", for: indexPath) as! BatchConsumptionCell 
batchConsumptionCell.setConsumption(consumption: consumption) 
return batchConsumptionCell 

我无法及时注入依赖关系。

在BatchConsumptionCell中,我在tableView(tableView:cellForRowAt :)中工作正常。该函数在dequeueReusableCell(withIdentifier:for :)被执行后调用。但只要我试图使tableView(tableView:numberOfRowsInSection :)动态我遇到问题。这个函数似乎在dequeueReusableCell(withIdentifier:for :)之前调用,所以在这一点上不会注入依赖关系。

我试图覆盖我的BatchConsumptionCell中的init(nibName:bundle :)初始值设定项,但这是一个UITableViewCell,所以我无法覆盖它。

怎样运用呢?当笔尖和其控制器初始化时,有什么办法可以注入依赖关系吗?还是我整理我的细胞都错了?任何想法将不胜感激。

因为在这里更清晰是我的代码:

ConsumptionDetailViewController

import UIKit 

class ConsumptionDetailViewController: UITableViewController { 

// MARK: - Properties 

var moc: NSManagedObjectContext! 

var consumption: Consumption! 


// MARK: - Outlet Properties 

@IBOutlet weak var labelDate: UILabel! 
@IBOutlet weak var labelTime: UILabel! 
... 


// MARK: - Default Methods 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let cellNib = UINib(nibName: "BatchConsumptionCell", bundle: nil) 
    tableView.register(cellNib, forCellReuseIdentifier: "BatchConsumptionCell") 

    updateTableFields(selectedConsumption: consumption) 
} 


// MARK: - UI Update Methods 

func updateTableFields(selectedConsumption: Consumption) { 

    labelId.text = selectedConsumption.wtId 
    ... 
} 

// MARK: - BatchAddEditDelegate Methods 

func didFinishEditing(consumption: Consumption) { 
    updateTableFields(selectedConsumption: consumption) 
} 

// MARK: - TableView Methods 

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    ... 
} 

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    ... 
} 

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { 
    ... 
} 

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    ... 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if indexPath.section == 1 && indexPath.row == 0 { 
     let batchConsumptionCell = tableView.dequeueReusableCell(withIdentifier: "BatchConsumptionCell", for: indexPath) as! BatchConsumptionCell 
     batchConsumptionCell.setConsumption(consumption: consumption) 
     return batchConsumptionCell 
    } 
    return super.tableView(tableView, cellForRowAt: indexPath) 
} 


// MARK: - Navigation 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    ... 
} 

} 

BatchConsumptionCell

import UIKit 

class BatchConsumptionCell: UITableViewCell, UITableViewDataSource, UITableViewDelegate { 

var consumption: Consumption! 
var batchConsumptionCount: Int! 

@IBOutlet weak var tableView: UITableView! 

override func awakeFromNib() { 
    super.awakeFromNib() 

    var cellNib = UINib(nibName: "BatchConsumptionBasicCell", bundle: nil) 
    tableView.register(cellNib, forCellReuseIdentifier: "BatchConsumptionBasicCell") 

    cellNib = UINib(nibName: "BatchConsumptionMultiCell", bundle: nil) 
    tableView.register(cellNib, forCellReuseIdentifier: "BatchConsumptionMultiCell") 

    self.tableView.delegate = self 
    self.tableView.dataSource = self 
} 

func setConsumption(consumption: Consumption) { 
    self.consumption = consumption 
    self.batchConsumptionCount = consumption.batchConsumptions?.count 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if batchConsumptionCount == 1 { // <-- This does not work 
     return 3 
    } else { 
     return batchConsumptionCount 
    } 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if batchConsumptionCount == 1 { // <-- This works fine 
     let batchConsumptionBasicCell = tableView.dequeueReusableCell(withIdentifier: "BatchConsumptionBasicCell", for: indexPath) as! BatchConsumptionBasicCell 
     let bc = consumption.batchConsumptions?.allObjects[0] as! BatchConsumption 
     if indexPath.row == 0 { 
      batchConsumptionBasicCell.configure(title: "Batch", detail: (bc.batch?.wtId)!) 
     } else if indexPath.row == 1 { 
      batchConsumptionBasicCell.configure(title: "Weight", detail: String(describing: bc.weight!)) 
     } else if indexPath.row == 2 { 
      batchConsumptionBasicCell.configure(title: "Price", detail: String(format:"%.2f", bc.price)) 
     } 
    } else if batchConsumptionCount >= 2 { 
     let batchConsumptionMultiCell = tableView.dequeueReusableCell(withIdentifier: "BatchConsumptionMultiCell", for: indexPath) as! BatchConsumptionMultiCell 
     return batchConsumptionMultiCell 
    } 
    return UITableViewCell() 
} 

} 

查看评论// <-- This works fine
// <-- This does not work在BatchConsumptionCell

+0

显示你的'setConsumumption' – Paulw11

+0

和也是在更新batchConsumptionCount值码? – bubuxu

+0

对不起,忘了setConsumption(消费:)在BatchConsumptionCell – Balse

回答

0

您也应该注册笔尖到BatchConsumptionCell类,并实施必要的表视图的数据源&委托方法:

class BatchConsumptionCell: UITableViewCell, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! 

    var consumption: Consumption! 
    var batchConsumptionCount: Int! 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     var cellNib = UINib(nibName: "BatchConsumptionBasicCell", bundle: nil) 
     tableView.register(cellNib, forCellReuseIdentifier: "BatchConsumptionBasicCell") 

     cellNib = UINib(nibName: "BatchConsumptionMultiCell", bundle: nil) 
     tableView.register(cellNib, forCellReuseIdentifier: "BatchConsumptionMultiCell") 

     self.tableView.delegate = self 
     self.tableView.dataSource = self 
    } 

    func setConsumption(consumption: Consumption) { 
     self.consumption = consumption 
     self.batchConsumptionCount = consumption.batchConsumptions?.count 
     tableView.reloadData() 
    } 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return consumption == nil ? 0 : 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if batchConsumptionCount == .some(1) { return 3 } 
     return batchConsumptionCount ?? 0 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     switch batchConsumptionCount { 
     case .some(1): 
      let batchConsumptionBasicCell = tableView.dequeueReusableCell(withIdentifier: "BatchConsumptionBasicCell", for: indexPath) as! BatchConsumptionBasicCell 
      let bc = consumption.batchConsumptions?.allObjects[0] as! BatchConsumption 
      if indexPath.row == 0 { 
       batchConsumptionBasicCell.configure(title: "Batch", detail: (bc.batch?.wtId)!) 
      } else if indexPath.row == 1 { 
       batchConsumptionBasicCell.configure(title: "Weight", detail: String(describing: bc.weight!)) 
      } else if indexPath.row == 2 { 
       batchConsumptionBasicCell.configure(title: "Price", detail: String(format:"%.2f", bc.price)) 
      } 
      return batchConsumptionBasicCell 

     default: 
      let batchConsumptionMultiCell = tableView.dequeueReusableCell(withIdentifier: "BatchConsumptionMultiCell", for: indexPath) as! BatchConsumptionMultiCell 
      return batchConsumptionMultiCell 

     } 
    } 

} 
+0

我已经这样做了。 BatchConsumptionCell看起来非常符合您的建议。头文件是'class BatchConsumptionCell:UITableViewCell,UITableViewDataSource,UITableViewDelegate',并且我使用'let nib = UINib(...'和'tableView.register(...')来调用单元格,但是我在哪里注入我的依赖关系进入这个BatchConsumptionCell ??? – Balse

+0

你是什么意思“注入我的依赖关系”?你是否可以在你的问题上粘贴你的整个BatchConsumptionCell代码? – bubuxu

+0

在我的BatchConsumptionCell里面我需要var'consumption'。目前,我通过'在我使用'dequeueReusableCell(withIdentifier:for:)'(见上面)加载它后,使用了batchConsumptionCell.setConsumption(consume:consumption)'但是当我尝试根据'tableView(tableView:numberOfRowsInSection :)'我得到一个错误。'tableView(tableView:numberOfRowsInSection:)'似乎被调用之前,我可以设置我的'消费'变种。 – Balse