tableView标头不更新数据Swift

时间:2016-08-28 05:54:23

标签: swift uitableview

我在ViewController中设置了一个tableView。此表视图有1个部分,2个原型单元格:一个用于返回部分中的行数,另一个用于显示自定义标题。 每次选择行时,都会生成我想要在标题中的标签中加载的数据。问题是,首次加载ViewController时,每次选择一行时,标题中的标签中的数据都不会更新。 如果我按下后退按钮并返回到保存标题的ViewController,数据将在标题上附带的标签中更新。 我做错了什么?

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return frequency.count
}

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


func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  headerCell = tableView.dequeueReusableCellWithIdentifier("customheader") as! CustomHeader

    headerCell.dateHeaderlabel.text = StructS.headerDate
     headerCell.hourHeaderlabel.text = StructS.headerHours + "-"
      headerCell.totalHoursHeaderlabel.text = String(StructS.numberHours)
       headerCell.priceHeaderlabel.text = String(StructS.price)
        headerCell.backgroundColor =  UIColor(red:72/255,green:141/255,blue:200/255,alpha:0.9)
    tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .None)
       return headerCell
}


func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 70.0
}

Before After

2 个答案:

答案 0 :(得分:1)

每当用户点击一个单元格时,就会调用didSelectRowAtIndexPath方法。因此,您可以执行的操作是将所选值保存在NSUserDefaults中,然后通过从用户默认值中获取该值来填充节标题。这样,当您返回到tableview时,您将在截面标题中看到最后选择的行数据。

答案 1 :(得分:0)

如果UIViewController中有UITableView对象。 将Main.storyboard中的UIViewController设置为dataSource和delegate。接下来在UIViewController的子类中,将self设置为表视图的委托和数据源。        override func viewDidLoad(){         self.tableView.delegate = self         self.tableView.dataSource = self  }

首次加载ViewController时,标题标签不会更新,因此您需要使用根据之前选择的行(保存在NSUserDefaults中)生成的信息更新标题中的数据。

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    // retrieve indexPathForCellSelected from NSUserDefaults
  if let retrievedIndexPath = NSUserDefaults.standardUserDefaults().dataForKey(indexKey) {
if let data1 = NSKeyedUnarchiver.unarchiveObjectWithData(retrievedIndexPath) as? NSIndexPath {
    indexPathForCellSelected = data1

    // inform the delegate that the row has already been selected
           self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForCellSelected!)

} 
     // handle the selection of the row so as to update the values of labels in section header
     if indexPathForCellSelected == nil {
        // construct an indexPath for the row we want to select when no previous row was selected ( not already saved in NSUserDefaults)
            let rowToSelect:NSIndexPath = NSIndexPath(forRow: 1, inSection: 0)

      /* select the row at `rowToSelect` indexPath. This will just register the selectd row, However,the code that you have in tableView:didSelectRowAtIndexPath: is not yet executed because the delegate for the tablewView object in the ViewController has not been called yet. */

         self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None)

        // inform the delegate that the row was selected
        // stackoverflow.com/questions/24787098/programmatically-emulate-the-selection-in-uitableviewcontroller-in-swift
             self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect)
    }

}