我的问题在我看来是个奇怪的行为。我用的是swift和ios9+。
我在故事板中设置了一个带有一些视图的UIViewController和一个tableview。(视图垂直位于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()
    }
}

最佳答案

最后我找到了一个解决办法。
我将UIViewController改为UITableViewController并将每个自定义UIView添加到带有自动布局的TableViewHeader(而不是节标题)中。
现在它开始工作了!

09-20 00:16