gpt4 book ai didi

Swift:tableView reloadSections 后不满足约束(自动布局)

转载 作者:可可西里 更新时间:2023-10-31 23:35:38 26 4
gpt4 key购买 nike

我的问题看起来很奇怪。我正在使用 Swift 和 iOS9+。

我在 Storyboard 中设置了一个 UIViewController,其中包含一些 View 和一个 tableview。 ( View 在 tableview 的垂直上方)所有设置都使用自动布局正确设置,没有警告并且 UIViewController 正确显示。

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

如果我点击部分标题中的按钮,则会出现另一个 View Controller ,我可以在其中过滤请求的数据。设置过滤器后, View Controller 关闭并在委托(delegate)中调用 refreshVitalSigns(...)。然后,我想重新加载 TableView 部分以仅显示过滤后的数据。当我再次调用reloadSections()时,我得到了很多不满意的约束警告并且 View 乱七八糟,我不知道为什么?????使用 reloadData() 一切正常,但我只想重新加载该部分。

仅供引用:请求 API 数据后,您必须滚动才能看到整个 TableView 内容。如果我先滚动查看全部内容,然后再进行过滤,那么 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 并在具有自动布局的 TableViewHeader(不是节标题)中添加了每个自定义 UIView

现在可以了!

关于Swift:tableView reloadSections 后不满足约束(自动布局),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38930926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com