我的问题看起来像是一种奇怪的行为。我使用的是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()
}
}
答案 0 :(得分:0)
最后我找到了解决方法。
我将UIViewController
更改为UITableViewController
并使用自动布局在TableViewHeader(NOT Section标题)中添加了每个自定义UIView
。
现在有效!