Swift:在tableView reloadSections之后不满意约束(自动布局)

时间:2016-08-13 08:43:33

标签: swift uitableview autolayout constraints

我的问题看起来像是一种奇怪的行为。我使用的是Swift和iOS9 +。

我在故事板中设置了UIViewController,其中包含一些观看次数和tableview。 (视图垂直位于桌面视图上方)所有设置都正确,自动布局,没有警告,UIViewController显示正确。

viewDidLoad()我从API请求一些表格视图数据并在获得响应后调用tableView.reloadSections(),该部分正确淡出。

如果我点击节标题中的按钮,则会显示另一个视图控制器,我可以在其中过滤所请求的数据。设置过滤器后,视图控制器将解除并在委托中调用refreshVitalSigns(...)。 然后,我想重新加载表视图部分以仅显示过滤的数据。当我再次打电话给reloadSections()时,我会收到许多令人不满意的约束警告,并且视图混乱,我不知道为什么?????? 使用reloadData()一切正常,但我只想重新加载该部分。

仅供参考:请求API数据后,您必须滚动才能看到整个表格视图内容。如果我先滚动,查看整个内容,然后过滤,reloadSections()也可以正常使用!显然,它应该在没有先滚动的情况下工作......

你知道为什么会发生这种奇怪的行为吗?

我很满意每一个提示!!!

最佳

class JMProfileViewController: UIViewController {

    /// Table view top spacing
    @IBOutlet weak var tableViewTopSpacing: NSLayoutConstraint!

    /// Table view
    @IBOutlet var tableView: UITableView!

    /// Attention view
    @IBOutlet var attentionView: JMAttentionView?

    var vitalSigns: [Items] = []
    var data: [Items] = []

    ...


    // View did load
    override func viewDidLoad() {
        super.viewDidLoad()

        ...

        // Table view row height
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 44.0

        // Register custom tableview header/footer views and cells
        ...

        // Get table view data
        let patientId = ...
        getData(patientId)
    }


    /**
     Get data

     - parameter patientId: Patient ID
     */
    func getData(patientId: Int) {

        // Request
        APIController.sharedInstance.getData(patientId: patientId) { response in

            // Result handling
            switch response {
            case .Success(let result):
                // Update vital signs
                self.vitalSigns = result
                self.data = result

                // Reload data
                self.tableView.beginUpdates()
                self.tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: .Fade)
                self.tableView.endUpdates()
            case .Failure(let error):
                print(error)
            }
        }
    }


    override func updateViewConstraints() {
        super.updateViewConstraints()

        // Set constraints depending on view's visibility
        if let view = attentionView {
            if view.hidden {
                tableViewTopSpacing.constant = 0
            } else {
                tableViewTopSpacing.constant = view.bounds.height
            }
        }
    }


    // MARK: - Navigation

    // Preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        // Data segue
        if segue.identifier == SegueIdentifier.JMVitalSignsSegue.rawValue {
            let vsvc = segue.destinationViewController as! JMVitalSignsViewController
            vsvc.delegate = self
        }
    }

}


// MARK: - UITableViewDataSource

extension JMProfileViewController: UITableViewDataSource {

    // Number of sections in table view
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 3
    }


    // Height for header in section
    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return section == 0 ? 0 : UITableViewAutomaticDimension
    }


    // Estimated height for header in section
    func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
        return section == 0 ? 0 : 27.0
    }


    // View for header in section
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        switch section {
        case 0:
            // First section without header
            return nil
        case 1:
            // Configure header
            let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier(CellIdentifier.JMTitleButtonHeaderView.rawValue) as! JMTitleButtonHeaderView
            header.configure(NSLocalizedString("vitalSigns", comment: ""), buttonTarget: self, buttonImage: UIImage(named: "ic_filter_dark"), buttonAction: #selector(parameterButtonTapped(_:)))
            return header
        default:
            // Configure header
            let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier(CellIdentifier.JMTitleButtonHeaderView.rawValue) as! JMTitleButtonHeaderView
            header.configure(NSLocalizedString("others", comment: ""))
            return header
        }
    }


    /**
     Vital signs button tapped
     */
    func parameterButtonTapped(sender: UIButton) {
        // Show vital signs view controller
        self.performSegueWithIdentifier(SegueIdentifier.JMVitalSignsSegue.rawValue, sender: self)
    }


    // Number of rows in section
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var rows = 0

        switch section {
        case 0:
            // Diagnosis
            rows = 1
            break
        case 1:
            // Vital signs
            rows = data.count > 0 ? data.count : 1
            break
        case 2:
            // Others
            rows = 3
            break
        default:
            break
        }

        return rows
    }


    // Cell for row at indexpath
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        switch indexPath.section {
        case 0:
            let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMSubtitleImageRightDetailCell.rawValue, forIndexPath: indexPath) as! JMSubtitleImageRightDetailCell
            // Configure cell
            ...
            return cell
        case 1:
            if data.count > 0 {
                let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMTitleThreeLabelsSubtitleCell.rawValue, forIndexPath: indexPath) as! JMTitleThreeLabelsSubtitleCell
                // Configure cell
                let item = data[indexPath.row]
                cell.configure(item.caption, unit: item.unit, values: item.values)
                cell.accessoryType = .DisclosureIndicator
                return cell
            } else {
                let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMBasicCell.rawValue, forIndexPath: indexPath)
                // Configure cell
                cell.textLabel?.text = NSLocalizedString("noData", comment: "")
                cell.selectionStyle = .None
                return cell
            }
        default:
            let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMBasicCell.rawValue, forIndexPath: indexPath) as! JMDefaultCell
            ...
            return cell
        }
    }
}


// MARK: - JMVitalSignsViewControllerDelegate

extension JMProfileViewController: JMVitalSignsViewControllerDelegate {

    /**
     Refresh vital signs
     */
    func refreshVitalSigns(selectedItems: [Items]) {
        print("Refresh vital signs")
        var data: [Items] = []
        for item in selectedItems {
            for vitalItem in vitalSigns {
                if item.match == vitalItem.match {
                    data.append(vitalItem)
                    break
                }
            }
        }
        self.data = data

        // HERE IS MY PROBLEM
//        tableView.beginUpdates()
//        tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: .Fade)
//        tableView.endUpdates()
        tableView.reloadData()
    }
}

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方法。

我将UIViewController更改为UITableViewController并使用自动布局在TableViewHeader(NOT Section标题)中添加了每个自定义UIView

现在有效!